1. 簡述:
所有類型和類型成員都具有可訪問性級別,用來控制是否可以在您程序集的其他代碼中或其他程序集中使用它們。 可使用訪問修飾符指定聲明類型或成員的可訪問性。
2. 5種訪問修飾符
訪問修飾符 | 說明 |
---|---|
public | 同一程序集中的任何其他代碼或引用該程序集的其他程序集都可以訪問該類型或成員。 |
private | 只有同一類或結構中的代碼可以訪問該類型或成員。 |
protected | 只有同一類或結構或者此類的派生類中的代碼才可以訪問的類型或成員。 |
internal | 同一程序集中的任何代碼都可以訪問該類型或成員,但其他程序集中的代碼不可以。 |
protected internal | 由其聲明的程序集或另一個程序集派生的類中任何代碼都可訪問的類型或成員。 從另一個程序集進行訪問必須在類聲明中發生,該類聲明派生自其中聲明受保護的內部元素的類,并且必須通過派生的類類型的實例發生。 |
3. 舉個栗子
public class Bicycle
{
public void Pedal()
{
}
}
4 . 類和結構的可訪問性
直接在命名空間中聲明的類和結構(即,沒有嵌套在其他類或結構中的類和結構)可以是公共類和結構,也可以是內部類和結構。 如果不指定訪問修飾符,則默認為 internal
。
結構成員,包括嵌套的類和結構,可以聲明為公共的、 內部的,或私人的。 類成員(包括嵌套的類和結構)可以為公共的、受保護的內部、受保護的、內部的或私有的。 類成員和結構成員的訪問級別,包括嵌套類和結構,默認為私有。 不可以從包含類型之外訪問私有嵌套類型。
派生類的可訪問性不能高于其基類型。 換句話說,不能有從內部類 A派生的公共類 B。 如果允許這種情況,將會使 A成為公共類,因為 A的所有受保護的成員或內部成員都可以從派生類訪問。
5. 類成員和結構成員的可訪問性
可以使用五種訪問類型中的任何一種來聲明類成員(包括嵌套的類和結構)。 結構成員無法聲明為受保護成員,因為結構不支持繼承。
通常,成員的可訪問性低于包含成員的類型的可訪問性。 如果由成員實現接口方法或重寫已在公共基類中定義的虛擬方法時,內部類的公共成員可以從外部程序集訪問。
任何成員的字段、 屬性或事件的類型必須至少與該成員本身一樣具備可訪問性。 同樣,作為方法、索引器或代表的任一成員的返回類型和參數類型必須至少有與該成員本身一樣的可訪問性。 例如,如果 C不是公共類,則不能返回類 C的公共方法 M。 同樣,如果 A聲明為私有,則類型 A不能有受保護的屬性。
析構函數不能具有可訪問性修飾符。
要設置類成員或結構成員的訪問級別,請向該成員聲明添加適當的關鍵字,如下面的示例所示。
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return wheels; }
}
}
6. 其他類型
- 接口成員始終是公共成員,因為接口的用途是讓其他類型能夠訪問某個類或結構。 訪問修飾符不能應用于接口成員。
- 枚舉成員始終是公共的,不能應用任何訪問修飾符。
- 委托行為類似于類和結構。 默認情況下,它們在命名空間中直接聲明時具有內部訪問權,在嵌套時具有私有訪問權。