C#訪問權限

C#所有類型和類型成員都具有可訪問性級別,用來控制是否可以在其他代碼中使用它們。

一、直接在命名空間中聲明(區別於內部類或內部結構)的類或結構
這種情況,可以用public,internal關鍵字進行訪問修飾。
public:對類或結構的訪問沒有限制。
internal(默認):只能在當前程序集訪問。可以使用 InternalsVisibleToAttribute 特性使其他某些程序集能夠訪問internal類型。
internal的訪問域是整個程序集,不是整個命名空間,因爲一個程序集可以包含多個命名空間,對程序集的簡單理解就是編譯後生成的exe文件或dll文件。
注意:
a.派生類的可訪問性不能高於其基類型。
換句話說,不能有從內部類 派生的公共類 B。 如果允許這種情況,將會使 成爲公共類,因爲 的所有受保護的成員或內部成員都可以從派生類訪問。

二、 類或結構的成員
可以利用publicinternalprotectedprivate 4個關鍵字設置5種訪問級別:
1.public
無訪問限制。
2.internal protected
可以理解爲internalprotected,其訪問域是internalprotected訪問域的並集。
(結構的成員不可使用,因爲結構不可被繼承,所以談不上protected
3.internal
當前程序集訪問。
4.protected
在同一類或子類內的代碼可以訪問,即使子類在不同的程序集。
(同樣的,不適用於結構中的成員)
5.private(默認)
只有在同一類或結構內的代碼可以訪問。
這裏需要明確“同一類或結構內的代碼”的意思,先看看下面的代碼:
    class C 

    {

        class C1 {

             int a = 0;

             void f1()

             {

                 C2 c = new C2();//可以訪問C2,因爲C2內可以訪問一切C類內可以訪問的東西(我個人的理解)

                 C2.C21 c = new C2.C21()//報,不可訪問C21,因爲C21不是C1的成員

             }

         }

         class C2 

         {

             protected class C21

             {

                 void f2()

                 {

                     C1 c = new C1();//可以訪問C1,因爲C21內可以訪問一切C2類內可以訪問的東西(我個人的理解)

                     int i = c.a;//報,不訪問c的私有成員a

                 }

             }

         }

         class C3 : C2

         {

             void f3()

             {

                 C21 c = new C21();//可以訪問C2受保護的成員C21,因爲C3繼承了C2

             }

         }

    }
f2可以訪問C1是因爲C21和C1都在C的內部嗎?如果是這樣,那爲什麼f1不可以訪問C21。
我覺得考慮private和protected中“同一類內的代碼”的含義,應該是不能跨越多個類的,即使是內部類。
內部類僅僅作爲外部類的成員,所以外部類的方法屬性等毫無疑問地是可以訪問此內部類的,然而內部類的方法,屬性等可以訪問外部類的成員,並不是因爲它們都在此外部類內,是因爲內部類可以訪問外部類一切可以訪問的東西,這是我個人的理解。
注意:
a.析構函數和靜態的構造函數不能具有可訪問性修飾符,因爲這些成員是由CLR直接調用的。
b.成員的實際訪問域 是 其訪問修飾符賦予的訪問域 與 成員所在類或結構的訪問域 的交集。
   也就是說,你只有先訪問到了類或結構,纔有可能訪問其中的成員。
c.任何成員(字段、 屬性或事件)的類型必須至少與該成員本身一樣具備可訪問性。
  也就是說,在可以訪問到該成員的地方,起碼要能夠訪問到該成員的類型吧。
d.同理,任何能夠訪問到成員(索引器,方法)的地方,起碼要能夠訪問成員的參數和返回值
e.自定義的運算符必須爲public

三、內部類或結構
類與類,類與結構,結構與結構之間可以相互嵌套。內部類或結構相當於外部類或結構的成員,所以以上的 類或結構的成員的敘述 適用於內部類或結構。

四、接口/枚舉/委託
接口的訪問權限默認爲internal。訪問修飾符不能應用於接口成員,接口成員的訪問權限默認是public
枚舉的訪問權限默認爲internal。訪問修飾符不能應用於枚舉成員,枚舉成員的訪問權限默認是public
委託在命名空間中聲明是默認具有internal訪問權限,在類或結構的內部聲明時默認具有private的訪問權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章