1. 程式人生 > >C#訪問修改符

C#訪問修改符

子類 known time red 對象 空間大小 sea color protect

修飾符可以指定訪問的可見性,還可以指定其本質。(文章摘自《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 = 144
abstract例子

C#訪問修改符