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