存取修飾詞 (C# 程式設計手冊)
所有類型和類型成員都有協助工具層級。 協助工具層級可控制它們是否可以從元件或其他元件中的其他程式碼使用。 元件是透過在單一編譯中編譯一或多個.cs檔案所建立的.dll或.exe。 當您宣告類型或成員時,請使用下列存取修飾詞來指定其存取範圍:
- public:類型或成員可由相同元件或其他參考它的元件中的其他程式碼存取。 類型的公用成員的存取層級是由類型本身的存取層級所控制。
- private:類型或成員只能由相同
class
或struct
中的程式碼存取。 - protected:類型或成員只能由相同
class
中的程式碼存取,或是class
衍生自該 的 中。class
- internal:類型或成員可由相同元件中的任何程式碼存取,但無法從另一個元件存取。 換句話說,
internal
可以從屬於相同編譯的程式碼存取類型或成員。 - protected internal:類型或成員可由宣告所在的元件中的任何程式碼存取,或從衍生自另一個元件中的程式
class
代碼存取。 - private protected:類型或成員可由衍生自
class
其包含元件內宣告的 型別存取。
摘要表格
呼叫端的位置 | public |
protected internal |
protected |
internal |
private protected |
private |
---|---|---|---|---|---|---|
在 類別內 | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
衍生類別 (相同的元件) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
非衍生類別 (相同的元件) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ |
衍生類別 (不同的元件) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ |
非衍生類別 (不同的元件) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ |
下列範例示範如何指定類型和成員的存取修飾詞︰
public class Bicycle
{
public void Pedal() { }
}
並非所有存取修飾詞對於所有內容中的所有類型或成員都有效。 在某些情況下,類型成員的存取範圍受限於其包含類型的存取範圍。
類別、記錄和結構協助工具
類別、記錄和結構在命名空間內直接宣告 (換句話說,這些類別或結構不會巢狀于其他類別或結構內,) 可以是 public
或 internal
。 internal
如果未指定任何存取修飾詞,則為預設值。
結構成員,包括巢狀類別和結構,可以宣告 public
為 、 internal
或 private
。 類別成員,包括巢狀類別和結構,可以是 public
、 protected internal
、 protected
、、 internal
、 private protected
或 private
。 類別和結構成員,包括巢狀類別和結構,預設具有 private
存取權。 私人巢狀類型無法從包含類型外部存取。
衍生類別和衍生記錄的存取範圍不能大於其基底類型。 您無法宣告衍生自內部類別 的公用類別 B
A
。 如果允許,它會產生公開 A
的效果,因為 的所有 protected
或 internal
成員 A
都可以從衍生類別存取。
您可以使用 啟用特定其他元件來存取您的內部類型 InternalsVisibleToAttribute
。 如需詳細資訊,請參閱 Friend 元件。
類別、記錄和結構成員協助工具
類別和記錄成員 (包括巢狀類別、記錄和結構) 可以使用六種存取類型的任一類型來宣告。 結構成員無法宣告為 protected
、 protected internal
或 private protected
,因為結構不支援繼承。
一般而言,成員的存取範圍不大於包含成員的型別存取範圍。 不過,如果成員實作介面方法或覆寫公用基類中定義的虛擬方法, public
內部類別的成員可能會從元件外部存取。
任何成員欄位、屬性或事件的類型至少必須和成員本身一樣可存取。 同樣地,傳回型別和任何方法、索引子或委派的參數型別至少必須和成員本身一樣可存取。 例如,除非 也是 ,否則您無法有 public
傳回類別 C
C
的方法 M
。 public
同樣地,如果 A
宣告為 private
,則不能有 protected
類型的 A
屬性。
使用者定義運算子一律必須宣告為 public
和 static
。 如需詳細資訊,請參閱運算子多載。
完成項不能有協助工具修飾詞。
若要設定 、 record
或 struct
成員的 class
存取層級,請將適當的關鍵字新增至成員宣告,如下列範例所示。
// 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; }
}
}
其他類型
直接在命名空間內宣告的介面可以是 public
或 internal
,就像類別和結構一樣,介面預設為 internal
存取。 介面成員 public
預設為 ,因為介面的目的是要讓其他類型的存取類別或結構。 介面成員宣告可能包含任何存取修飾詞。 這最適用于靜態方法,以提供類別之所有實作所需的一般實作。
列舉成員一律 public
為 ,而且無法套用任何存取修飾詞。
委派的行為類似類別和結構。 根據預設,它們會在命名空間內直接宣告時具有 internal
存取權,並在 private
巢狀時存取。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法及用法的限定來源。