类成员声明语句由下列部分组成,方括号表示该成分是可选的。
修饰符
例如,下面两行代码在语义上是等价的:
public static int MaxVal;
static public int MaxVal;
特性
类名.静态成员
的方式:using
声明: 即使类没有实例,也存在静态成员。
用于初始化成员常量的值在编译时必须是可计算的,通常是一个预定义简单类型。
C# 中没有全局常量。
常量没有自己的储存位置,而是在编译时被编译器替换,类似于 C/C++ 的 #define。
不能将常量声明为 static。
属性有如下特征:
属性是一个函数成员,具有 set 和 get 访问器。
属性本身没有任何存储,set 决定如何处理发送进来的数据,get 决定将什么数据发送出去。
不能显示地调用访问器。
一种常见的方式是:在类中将字段声明为 private 进行封装,同时声明一个 public 属性来控制从类的外部对该字段的访问。和属性关联的字段被称为 后备字段 或 后备存储。
两种命名约定:
private int firstField; // Camel 大小写
public int FirstField { // Pascal 大小写
get { return firstField; }
set { firstField = value; }
}
private int _secondField; // Camel 大小写 + 下划线
public int SecondField { // Pascal 大小写
get { return _secondField; }
set { _secondField = value; }
}
C# 7.0 引入了 lambda 表达式语法,在函数体只有一个表达式时可以使用:
int theRealValue = 10;
int MyValue {
set => theRealValue = value > 100 ? 100 : value;
get => theRealValue;
}
按照推荐的编码实践,属性比公有字段更好,理由如下:
如果你为类声明了任何构造函数,那么编译器不会为该类定义默认构造函数。
通常,静态构造函数初始化类的静态字段。
const 字段只能在字段的声明语句中初始化,readonly 字段可以在下列任意位置中设置初始值:
const 字段的值必须在编译时决定,readonly 字段的值可以在运行时决定。
const 的行为总是静态的,readonly 字段可以:
this 表示对当前实例的引用,不能在任何静态函数成员中使用。其使用范围为:
实际上,this 很少在代码中使用。
可以认为索引器是为类的多个数据成员提供 get 和 set 访问的属性。
索引器是一组 get 和 set 访问器,与属性类似。
当索引器被用于赋值时,set 访问器被调用,并接受两项数据:
当使用索引器获取值时,可以通过索引参数调用 get 访问器,指示获取哪个值。
和属性一样,不能显示调用 get 和 set 访问器。
只要索引器的参数列表不同,类就可以有多个索引器。
默认情况下,成员访问器的访问级别和自身相同。
可以为两个访问器分配不同的访问级别。
仅当成员具有两个访问器时,访问器才可以有修饰符。
两个访问器中只有一个能有访问修饰符;另一个不能,表示和成员的访问级别相同。
(因为访问器不能同时比成员自身的访问级别更严格)
访问器的访问修饰符的限制需要比成员自身的访问级别更严格。
类的声明可以分割成几个分部类的声明,每个分部类声明必须被标注为 partial class。
除了分部类,还可以创建如下两种分部类型:
定义分部方法。
实现分部方法。
有关分部方法的说明如下:
签名和返回类型的特征如下:
当不声明为 public 时,可以仅有定义部分。此时编译器将移除所有该方法的内部调用。