修饰符可以指定访问的可见性,还可以指定其本质。(文章摘自《C#高级编程(第9版)》以及Microsoft)
1. 可见性修饰符
public:应用于所有类型或成员,即任何代码均可以访问该项——公有访问,不受任何限制
protected:应用于类型和内嵌类型的所有成员,即只有派生的类型能访问该项——保护访问,只限于本类和子类访问
internal:应用于所有类型或成员,即只能在包含它的程序集中访问该项——内部访问。只限于本程序集内访问。不带修饰符的类是默认internal
private:应用于类型和内嵌类型的所有成员,即只能在它所属的类型中访问该项——私有访问。只限于本类成员访问
protected internal:应用于类型和内嵌类型的所有成员,即只能在包含它的程序集和派生类型的任何代码中访问该项——内部保护访问。只限于本程序集内和子类访问。
注:protected、private、protected internal不能用来定义类,只能应用于成员。但是可用于定义嵌套类,嵌套的内部类可以访问外部类所有成员,包括私有成员。
1 public class OuterClass //不能使用protected、private、protected internal 2 { 3 protected class InnerClass //可以使用protected、private、protected internal,可以访问OuterClass所有成员,其为OuterClass成员之一 4 { 5 // etc. 6 } 7 // etc. 8 }
2. 其他修饰符
new:应用于函数成员,即成员用相同的签名隐藏继承的成员—— new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏。override 修饰符会扩展继承成员的实现。对同一成员同时使用 new 和 override 是错误的做法。详见https://msdn.microsoft.com/zh-cn/435f1dw2(VS.80).aspx
static:应用于所有成员,即成员不作用于类的具体实例——存储在全局数据区,不占用类的空间大小。
virtual:仅应用于函数成员,即成员可以由派生类重写——该修饰符修饰的函数可以作为正常的函数使用,也可以在派生类中用override进行重写
abstract:仅应用于函数成员,即虚拟成员定义了成员的签名,但没有提供实际代码——该修饰符修饰的函数不能作为正常的函数使用,必须在派生类中用override进行重写
override:仅应用于函数成员,即成员重写了继承的虚拟或抽象成员
sealed:应用于类、方法和属性,即对于类,不能继承自密封类。对于属性和方法,成员重写已继承的虚拟成员,但任何派生类中的任何成员都不能重写该成员。该修饰符必须与override一起使用。——禁止继承
extern:仅用于静态DllImport方法,即成员在外部用另一种语言实现。——用于声明在外部实现的方法,此时方法还需声明为static;不能与abstract一起使用
const: 用于声明某个常量字段或常量局部变量,即指定域或局部变量的值不能被改动。
event:用于声明发布服务器类中的事件
readonly:可应用于字段,即只能在声明时以及相同类的内部被赋值。
注:
- abstract、sealed作为类修饰符
abstract:以指示某个类只能作为其他类的基类。
sealed:以指示某个类不能被继承。
- virtual和abstract区别
1 class MyBaseClass 2 { 3 // virtual auto-implemented property. Overrides can only 4 // provide specialized behavior if they implement get and set accessors. 5 public virtual string Name { get; set; } 6 7 // ordinary virtual property with backing field 8 private int num; 9 public virtual int Number 10 { 11 get { return num; } 12 set { num = value; } 13 } 14 } 15 16 17 class MyDerivedClass : MyBaseClass 18 { 19 private string name; 20 21 // Override auto-implemented property with ordinary property 22 // to provide specialized accessor behavior. 23 public override string Name 24 { 25 get 26 { 27 return name; 28 } 29 set 30 { 31 if (value != String.Empty) 32 { 33 name = value; 34 } 35 else 36 { 37 name = "Unknown"; 38 } 39 } 40 } 41 42 }
1 abstract class ShapesClass 2 { 3 abstract public int Area(); 4 } 5 class Square : ShapesClass 6 { 7 int side = 0; 8 9 public Square(int n) 10 { 11 side = n; 12 } 13 // Area method is required to avoid 14 // a compile-time error. 15 public override int Area() 16 { 17 return side * side; 18 } 19 20 static void Main() 21 { 22 Square sq = new Square(12); 23 Console.WriteLine("Area of the square = {0}", sq.Area()); 24 } 25 26 interface I 27 { 28 void M(); 29 } 30 abstract class C : I 31 { 32 public abstract void M(); 33 } 34 35 } 36 // Output: Area of the square = 144