C#訪問修改符
修飾符可以指定訪問的可見性,還可以指定其本質。(文章摘自《C#高級編程(第9版)》以及Microsoft)
1. 可見性修飾符
public:應用於所有類型或成員,即任何代碼均可以訪問該項——公有訪問,不受任何限制
protected:應用於類型和內嵌類型的所有成員,即只有派生的類型能訪問該項——保護訪問,只限於本類和子類訪問
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創建對象時,可調用默認的構造函數
static:應用於所有成員,即成員不作用於類的具體實例——存儲在全局數據區,不占用類的空間大小。
virtual:僅應用於函數成員,即成員可以由派生類重寫——該修飾符修飾的函數可以作為正常的函數使用,也可以在派生類中用override進行重寫
abstract:僅應用於函數成員,即虛擬成員定義了成員的簽名,但沒有提供實際代碼——該修飾符修飾的函數不能作為正常的函數使用,必須在派生類中用override進行重寫
override:僅應用於函數成員,即成員重寫了繼承的虛擬或抽象成員
sealed:應用於類、方法和屬性,即對於類,不能繼承自密封類。對於屬性和方法,成員重寫已繼承的虛擬成員,但任何派生類中的任何成員都不能重寫該成員。該修飾符必須與override一起使用。——禁止繼承
extern:僅用於靜態DllImport方法,即成員在外部用另一種語言實現。——用於聲明在外部實現的方法,此時方法還需聲明為static;不能與abstract一起使用
例: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 }virtual例子
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 = 144abstract例子
C#訪問修改符