扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
通过在声明方法时指定 params 关键字,C# 允许我们发送可变数目的参数。参数列表也可以包含普通参数,但是需要注意,用 params 关键字声明的参数必须放在最后。它采用可变长度数组的形式,并且每个方法只有一个 params 参数。
当编译器尝试解析一个方法调用时,它查找其参数列表与调用的方法相匹配的方法。如果找不到可以与参数列表匹配的方法重载,但是存在与适当类型的 params 参数匹配的版本,则会调用该方法,并将额外的参数放在一个数组中。
下面的示例对此进行了演示:
using System; public class ParamsClass { public static void Main(string[] args) { Average ("List One", 5,10,15); Average ("List Two", 5,10,15,20,25,30); } public static void Average (string title, params int[] values) { int Sum = 0; Console.Write("Average of {0}: ", title); for (int i = 0; i < values.Length; i++) { Sum += values[i]; Console.Write(values[i] + ", "); } Console.WriteLine(": {0}", (float)Sum/values.Length); } }
在上面的示例中,用整型数组中的 params 参数声明了方法 Average,让我们使用任何数目的参数来调用它。输出结果如下:
Average of List One: 5, 10, 15, : 10 Average of List Two: 5, 10, 15, 20, 25, 30, : 17.5
注意,如果我们希望允许不同类型的不确定参数,我们可以指定 Object 类型的 params 参数。
在 C# 中,属性是类、struct,或接口的命名成员,它提供了一种简洁的途径,可以通过所谓的 get 和 set 访问器方法访问私有字段。
下面的代码片断为类 Animal 声明了一个名为 Species 的属性,它抽象了对名为 name 的私有变量的抽象访问:
public class Animal { private string name; public string Species { get { return name; } set { name = value; } } }
通常,属性与它访问的内部成员有相同的名称,但是属性以大写字母开头(例如上面的示例中的 Name),或者内部成员带有“_”前缀。同时还需要注意 set 访问器中所用的名为 value 的隐式参数 — 这种参数具有基础成员变量类型。
实际上,访问器在内部表示成 get_X() 和 set_X() 方法,从而与 .NET 语言保持兼容,因为 .NET 语言并不支持访问器(如本文前面的 typeOf 和 GetType() 部分中的屏幕截图所示)。一旦定义好属性,就可以非常容易地获取或设置它的值:
Animal animal = new Animal() // Set the property animal.Species = "Lion"; // Get the property value string str = animal.Species;
如果属性只有 get 访问器,它就是一个只读属性。如果它只有 set 访问器,它就是一个只写属性。如果两者都有,则它是一个可读写属性。
C# 支持 struct 关键字,它是源于 C 的另一个项,但是不可用于 Java。可以将 struct 看作是一个轻量级类。它可以采用与类大致相同的方式包含构造函数、常量、字段、方法、属性、索引器、运算符和嵌套类型。structs 不同于类,因为它们不能是抽象的,并且不支持实现继承。结构与类还有一点重要的不同,结构是值类型的,而类是引用类型的。在构造函数的工作方式上,结构也有所不同。特别是,编译器总是提供默认的不带参数的构造函数,并且不允许您替换它。
在下面的示例中,我们使用 new 关键字并且通过初始化实例的成员初始化了一个 struct:
using System; public struct CustomerStruct { public int ID; public string name; public CustomerStruct(int customerID, string customerName) { ID = customerID; name = customerName; } } class TestClass { public static void Main(string[] args) { // Declare a CustomerStruct using the default constructor CustomerStruct customer = new CustomerStruct(); Console.WriteLine("Struct values before initialization"); Console.WriteLine("ID = {0}, Name = {1}", customer.ID, customer.name); customer.ID = 100; customer.name = "Robert"; Console.WriteLine("Struct values after initialization"); Console.WriteLine("ID = {0}, Name = {1}", customer.ID, customer.name); } }
当我们编译并运行上面的代码时,它的输出显示,该结构的变量在默认情况下是已初始化的。int 变量初始化为 0,而字符串变量初始化为空字符串:
初始化前的 struct 变量
ID = 0, Name =
初始化后的 truct 值
ID = 100, Name = Robert
注意,当我们使用另一种表示法(CustomerStruct customer)声明 customer 时,它的成员变量将不被初始化,因此,如果试图在为它们赋值前使用它们,将会产生编译时错误
查看本文来源如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者