-
成员
类的成员(字段):静态成员和实例成员
静态成员:属于类,通过类名.成员名调用
实例成员:属于类的实例化对象。
方法同样也分为实例方法和静态方法。静态方法只能访问静态成员,实例方法可以访问静态成员和非静态成员。实例方法可以用 this 来访问该实例,而在静态方法中引用 this 是错误的。
-
可访问性
类的每个成员都有关联的可访问性,它控制能够访问该成员的程序文本区域。
public 访问不受限制
protected 访问仅限于包含类或从包含类派生的类型
private 访问仅限于包含类
internal 访问仅限于当前程序集
protected internal 访问仅限于从包含类派生的当前程序集
-
参数
用于将值或引用变量传递给方法。分为:值参数、引用参数(ref)、输出参数(out)、参数数组
参数数组:允许将可变长度的自变量列表传递给方法,用 params 修饰符声明。只有方法的最后一个参数能够被声明为参数数组,而且必须是一维数组的类型。
public static void Write(string fmt, params object[] args)
{
……
}
Object args = new Object[3];
args[0] = x;
args[1] = y;
args[2] = z;
Write("x={0} y={1} z={2}", args);
C#要求局部变量在其值获得之前明确赋值。
-
虚拟方法 virtual关键字修饰
在一个虚拟方法的调用中,该调用所涉及的实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。在非虚拟方法中,实例的编译时类型是决定性因素。
虚拟方法可以有派生类重写实现。当一个实例方法声明中含有 override 修饰符时,该方法重写父类同名虚方法。(用来实现多态)
-
抽象方法(abstract)
是没有实现的虚拟方法。抽象方法的声明是通过 abstract 修饰实现的,并且只允许在抽象类中使用抽象方法声明,非抽象类的派生类需要重写抽象方法。
-
其他函数成员:构造函数、属性、索引器、事件、运算符、析构函数
-
构造函数
C#即支持实例构造函数也支持静态构造函数。
实例构造函数:是用来实现初始化类实例的。
静态构造函数:首次加载时用于实现初始化类本身。
-
属性(property)
是字段的自然扩展,两者是具有关联类型的命名成员,而且访问字段和属性的语法是相同的。属性与字段不同的是,属性不表示存储位置。
属性有访问器(accessor)指定在被访问时执行的语句。 get/set 访问器
对访问器的不同声明方式可以有:只读属性、只写属性、读写属性
-
索引器
使对象能够以数组相同的方式进行索引。
索引器的声明类似属性,不同之处在于使用 this 做索引名字,在定界符 [] 之间写参数列表。索引器可以有多个构成重载。
public object this[int index] {
get {
return items[index];
}
set {
items[index] = value;
}
}
name = str; //执行set访问器
str = name; //执行get访问器
-
事件
是使对象或类能提供通知的成员,事件声明需使用 event 关键字,并且事件声明的类型必须是委托类型。
事件类似一个字段,该字段保存一个委托的引用,如果未添加任何事件处理程序,则该字段为 null。使用“+=”添加事件处理程序,“-=”移除。
class xxx {
public event EventHandler Changed;
protected virtual void OnChanged() {
if(Changed != null)
Changed(this, EventArgs.Empty);
}
static changeCount;
static void ListChanged(Object sender, EventArgs e) {
changeCount ++;
}
name.Changed += new EventHandler(ListChanged);
Changed 事件表明有一个新项添加到事件处理程序列表,它由 OnChanged 虚方法引发。
}
-
运算符 operator
是一种函数成员,用来定义可应用于类实例的特定表达式运算符的含义。是对操作符的重载。
必须使用 public 和 static 声明。
public static bool operator == (List a, List b) {
return Equals(a, b);
}
-
析构函数 (destructor)
用于实现析构类实例所需操作的成员。析构函数不能带参数,不能具有可访问性修饰符,不能被显示调用。
析构函数的调用实际是不确定的,并且可能运行在任何线程上。
-The End-
© Jervis