类型成员
更新:2007 年 11 月
运行库允许定义类型的成员:事件、字段、嵌套类型、方法和属性。每个成员都有一个签名。下表说明了 .NET Framework 中使用的类型成员。
成员 |
说明 |
---|---|
定义可以响应的事件,并定义订阅、取消订阅及引发事件的方法。事件通常用于通知其他类型的状态改变。 |
|
字段 |
描述并包含类型状态的一部分。字段可以是运行库支持的任何类型。 |
在封闭类型范围内定义类型。 |
|
方法 |
描述可用于类型的操作。方法的签名指定其所有参数和返回值的允许类型。 构造函数是一种特殊类型的方法,可创建类型的新实例。 |
命名类型的值或状态,并定义获得或设置属性值的方法。属性可以是基元类型、基元类型的集合、用户定义的类型或用户定义类型的集合。属性通常用于使类型的公共接口独立于类型的实际表示形式。 |
成员特征
通用类型系统允许类型成员具有多种特征,但并不要求语言能支持所有这些特征。下表说明了这些成员特征。
特征 |
可应用到 |
说明 |
---|---|---|
abstract |
方法、属性和事件 |
类型不提供方法的实现。继承抽象方法的类型和用抽象方法实现接口的类型必须提供方法的实现。只有当派生的类型本身是抽象类型的时候,情况例外。所有的抽象方法都是虚的。 |
private、family、assembly、family 和 assembly、family 或 assembly,或者 public |
全部 |
定义成员的可访问性:
|
final |
方法、属性和事件 |
虚方法不能在派生类型中被重写。 |
initialize-only |
字段 |
该值只能被初始化,不能在初始化之后写入。 |
instance |
字段、方法、属性和事件 |
如果成员未标记为 static(C# 和 C++)、Shared (Visual Basic)、virtual(C# 和 C++)或 Overridable (Visual Basic),那么它是一个实例成员(没有实例关键字)。内存中这些成员的副本数将会像使用它们的对象数一样多。 |
literal |
字段 |
分配给该字段的值是一个内置值类型的固定值(在编译时已知)。文本字段有时指的是常数。 |
newslot 或 override |
全部 |
定义成员如何与具有相同签名的继承成员进行交互:
默认为 newslot。 |
static |
字段、方法、属性和事件 |
成员属于定义它的类型,而不属于该类型的特定实例;即使不创建类型的实例,成员也会存在,并且它由该类型的所有实例共享。 |
virtual |
方法、属性和事件 |
此方法可以由派生类型实现,并且既可静态调用,也可动态调用。如果使用动态调用,在运行时执行调用的实例类型(而不是编译时已知的类型)将确定调用方法的哪一种实现。若要静态调用虚方法,可能需要将变量强制转换为使用方法的所需版本的类型。 |
重载
每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。例如,在 System.Char 中,IsDigit 被重载。一种方法使用了一个 Char 并返回一个 Boolean。另一种方法使用了一个 String 和一个 Int32,并返回一个 Boolean。参数列表也可以通过 varargs 约束来限定,此约束指示方法支持一个变量参数列表。
继承,重写和隐藏成员
派生的类型继承其基本类型的所有成员;也就是说,这些成员是在派生类型之上定义的,并可用于派生类型。继承成员的行为和质量可以通过以下两种方式来修改:
派生类型可通过使用相同的签名定义一个新成员,从而隐藏继承的成员。将先前的公共成员变成私有成员,或者为标记为 final 的继承方法定义新行为时,可以采取这种方法。
派生类型可以重写继承的虚方法。重写方法提供了对方法的一种新定义,将根据运行时的值的类型,而不是编译时已知的变量类型来调用方法。只有当虚方法没有标记为 final 且新方法至少可以像虚方法一样进行访问的情况下,成员才能重写虚方法。