C#訪問修改符

修飾符能夠指定訪問的可見性,還能夠指定其本質。(文章摘自《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做爲類修飾符

          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 }
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例子
相關文章
相關標籤/搜索