限定符是用于限定类型和类型成员的声明。包含访问限定符、abstract、const、event、extern、override、sealed、static、virtual等。
访问限定符
访问限定符是用于指定成员或者类型的可访问性的关键字。
● public
● protected
● internal
● private
下面的五种可访问级可以通过使用访问限定符进行指定:
public protected internal internal protected private
abstract(抽象)
abstract 限定符被用于类、方法以及属性。
在类定义中使用abstract 限定符,表明该类仅仅用来作为其他类的基类。
抽象类有以下特征:
● 抽象类是不能被例示的。
● 抽象类可以包含抽象方法和存取器。
● 不可能用被封装的限定符修改抽象类,即该类不能被继承。
● 由抽象类继承而来的非抽象类必须包括所有派生抽象方法和存取器的实际应用。
方法或属性声明中的抽象限定符用来指明该方法或属性中不包含实际应用。
抽象方法有以下特征:
● 抽象方法是隐式虚方法。
● 抽象方法声明只允许在抽象类中存在。
● 因为抽象方法声明并不提供实际应用,所以事实上并没有方法体;方法声明以分号结束,并且在签名后没有括号。
● 应用由非抽象类的覆盖方法(overriding method)提供。
● 在抽象方法声明中使用静态、虚拟或者覆盖限定符,都是错误的。除了声明和调用文法中有区别,其他时候抽象属性和抽象方法工作起来都很类似。
● 在静态属性中使用抽象限定符是错误的。
● 在继承类中,可使用包含覆盖限定符的属性声明来覆盖抽象继承属性。抽象类必须为所有接口提供应用。
const(常量)
关键字const 用来修改一个域或本地变量的声明。它将该域或本地变量的值指定为不可修改。常量声明介绍了给定类型一个或者多个常量。声明采用以下格式:
[attributes] [modifiers] const type declarators;
其中,
attributes (可选)
可选择的声明信息。
modifiers (可选)
可选择的限定符,包含新的限定符和4个访问限定符(access modifiers)之一。
type
以下类型之一:字节、字符、短整数、整数、长整数、浮点数、双字节数、小数、布尔数、串、枚举类型或者引用类型。
Declarators
用逗号隔开的被声明量。声明量有如下结构:
identifier = constant-expression
attributes (属性 )和modifiers( 限定符 )应用于所有由常量声明的成员。
常量声明的 Type ( 类型 ) 指定了声明介绍的成员的类型。常量表达必须产生一个目标类型的值,或者是一个可以显式转化为目标类型的类型的值。
常量表达的值在编译时可以被充分估算。因此,引用类型的常量的可能值只能是串(string)和空(null)。
event(事件)
指定事件。
[attributes] [modifiers] event type declarator;
[attributes] [modifiers] event type member-name {accessor-declarations};
其中:
accessor-declarations
property accessors的声明, 用来读写属性。
attributes (可选)
可选声明信息。
declarator
事件名称。
member-name
事件属性名称。
modifiers (可选)
可选限定符,包括new(新), static(静态), 以及 4 个access modifiers(访问限定符)之一。
type
希望用来联系事件的代表。
extern(外部)
在方法声明中使用 extern限定符,指明该方法是外部实现的。通常情况下,外部限定符都和DllImport属性一起使用。
将abstract(抽象)和extern(外部)限定符放在一起修饰相同成员是错误的。使用 extern限定符意味着该方法在 C#外部实施,而使用 abstract 限定符的意思是类中不提供该方法的实施。
因为外部方法声明不提供实际应用,所以没有方法体;方法声明简单地由分号结束,并且在签名后没有括号({ })。
override(覆盖)
override 限定符用来修改方法或属性。覆盖方法为从基类继承的成员提供新的应用。被覆盖声明所覆盖的方法称之为被覆盖库方法(overridden base method)。被覆盖库方法必须与覆盖方法有相同的签名。
非虚拟或者静态方法是不能被覆盖的。被覆盖类方法必须是虚拟、抽象或覆盖方法。覆盖声明不能改变虚拟方法的可访问性。覆盖方法和虚拟方法都必须有相同的访问级别限定符。
不能使用下列限定符对覆盖方法进行修改:
new static virtual abstract (新、静态、虚拟、抽象)
覆盖属性声明指定的访问限定符、类型和名字必须与被继承属性完全相同,被覆盖属性必须是虚拟、抽象或是覆盖。
readonly(只读)
Readonly关键字是在域(field)中使用的限定符。当域声明包含 readonly限定符时,则由声明引入该域的赋值只能作为同类声明或构造函数的一部分。
sealed(封装)
被封装类不能被继承。将被封装类作为基类使用是错误的。在类声明中使用被封装限定符,用来防止对类的意外继承。
说明
● 不允许在被封装类中使用abstract(抽象)限定符。
● 结构是隐式封装,因此,它们不能被继承。
static
使用 static 限定符可以声明静态成员,静态成员属于类型本身而不属于特定的对象。Static 限定符可以在字段、方法、属性、操作符和构造函数中使用,但是不能在索引器、析构函数或者类型中使用。
说明
2. 静态成员不能通过实例进行引用,而应该通过类型名称引用。
virtual
virtual关键字用于修改方法或者属性声明,这种情况下方法或者属性由虚拟成员调用。虚拟成员的执行可以由派生类中的覆盖成员进行修改。调用虚拟成员时,会为覆盖成员检查对象的运行时间类型。如果没有派生类覆盖成员,将调用大多数派生类中的覆盖成员(它们可能是原始成员)。
默认情况下,方法是非虚拟的。用户不能覆盖一个非虚拟的方法。用户也不能将virtual限定符同下列限定符一起使用:
static abstract override
除了在
声明和调用的语法上有所区别外,虚拟属性的行为类似于抽象方法。
● 对静态属性使用virtual限定符是错误的。
● 虚拟继承属性可以在派生类中被使用override限定符的属性声明所覆盖。