存取修飾詞 (C# 程式設計手冊)
更新:2007 年 11 月
所有型別與型別成員都有存取層級,用來控制您的組件或其他組建中的其他程式碼是否可以使用這些型別與成員。您可以在宣告型別或成員時,使用下列其中一個存取修飾詞指定存取範圍:
public
型別或成員可由相同組件或參考該組件的另一個組件中的任何其他程式碼存取。private
型別或成員只能由相同類別或結構中的程式碼存取。protected
型別或成員只能由相同類別或結構中,或是衍生類別中的程式碼存取。internal
型別或成員可由相同組件中的任何程式碼存取,但是不包括其他組件中的程式碼。protected internal
型別或成員可由相同組件中的任何程式碼,或是其他組件中的任何衍生類別存取。
以下範例示範如何指定型別和成員上的存取修飾詞:
public class Bicycle
{
public void Pedal() { }
}
並非所有存取修飾詞在任何情況下都可供所有型別或成員使用,而且在某些情況下,型別成員的存取範圍會受到其包含型別的存取範圍限制。以下章節提供更多關於存取範圍的詳細資訊。
類別和結構的存取範圍
直接在命名空間中宣告的類別和結構 (換句話說,並未巢狀設定於其他類別或結構中) 可以是 public 或 internal。如果未指定存取修飾詞,則預設值為 internal。巢狀類別和結構也可以宣告為 private。Private 巢狀型別無法從包含型別存取。
衍生類別的存取範圍不可大於其基底型別的存取範圍。換句話說,不可以有衍生自 internal 類別 A 的 public 類別 B。如果允許這種情況出現,則 A 會變成 public,因為 A 的所有 protected 或 internal 成員都可從衍生類別存取。
您可以使用 InternalsVisibleToAttribute 讓其他特定組件存取您的 internal 型別。如需詳細資訊,請參閱 Friend 組件 (C# 程式設計手冊)。
類別和結構成員的存取範圍
類別成員 (包括巢狀類別和結構) 可使用五種存取型別的任一種宣告。結構成員無法宣告為 protected,因為結構不支援繼承。
成員的存取範圍絕不可大於其包含型別的存取範圍。例如,internal 型別中宣告的 public 方法只有 internal 存取範圍。
如果類別或結構的成員為屬性、欄位、方法、事件或委派,且該成員為型別或是擁有做為參數或傳回值的型別,則成員的存取範圍不可大於該型別。例如,不可以有傳回類別 C 的 public 方法 M,除非 C 同樣是 public。同樣地,如果 A 宣告為 private,則型別 A 不可以有 protected 屬性。
使用者定義的運算子必須永遠宣告為 public。如需詳細資訊,請參閱operator (C# 參考)。
解構函式不能有存取範圍修飾詞。
若要設定類別或結構成員的存取層級,請在成員宣告中加入適當的關鍵字。以下是一些範例:
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return wheels; }
}
}
注意事項: |
---|
protectedinternal 存取範圍表示 protected OR (或) internal,而非 protected AND (和) internal。換句話說,protectedinternal 成員可從在相同組件中的任何類別進行存取,其中也包括衍生類別。若要將存取範圍限制為僅在相同組件中的衍生類別,請將類別本身宣告為 internal,並且將其成員宣告為 protected。 |
其他型別
直接使用命名空間宣告的介面可以宣告為 public 或 internal,而且就像類別和結構,介面會預設為內部存取。介面成員固定為 public,因為介面的目的在於讓其他型別存取類別或結構。介面成員無法套用任何存取修飾詞。
列舉型別成員也都是公用成員,無法套用任何存取修飾詞。
根據預設,委派 (Delegate) 會具有內部存取權。
C# 語言規格
如需詳細資料,請參閱 C# 語言規格中的下列章節:
3.5 成員存取
10.3.5 存取修飾詞