修飾符能夠指定訪問的可見性,還能夠指定其本質。(文章摘自《C#高級編程(第9版)》以及Microsoft)編程
1. 可見性修飾符服務器
public:應用於全部類型或成員,即任何代碼都可以訪問該項——公有訪問,不受任何限制ide
protected:應用於類型和內嵌類型的全部成員,即只有派生的類型能訪問該項——保護訪問,只限於本類和子類訪問函數
internal:應用於全部類型或成員,即只能在包含它的程序集中訪問該項——內部訪問。只限於本程序集內訪問。不帶修飾符的類是默認internalui
private:應用於類型和內嵌類型的全部成員,即只能在它所屬的類型中訪問該項——私有訪問。只限於本類成員訪問spa
protected internal:應用於類型和內嵌類型的全部成員,即只能在包含它的程序集和派生類型的任何代碼中訪問該項——內部保護訪問。只限於本程序集內和子類訪問。code
注:protected、private、protected internal不能用來定義類,只能應用於成員。可是可用於定義嵌套類,嵌套的內部類能夠訪問外部類全部成員,包括私有成員。blog
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:以指示某個類不能被繼承。
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