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