1. 程式人生 > >訪問修飾符(C# 程式設計指南)

訪問修飾符(C# 程式設計指南)

所有型別和型別成員都具有可訪問性級別,該級別可以控制是否可以從你的程式集或其他程式集中的其他程式碼中使用它們。 可以使用以下訪問修飾符在進行宣告時指定型別或成員的可訪問性:

public
同一程式集中的任何其他程式碼或引用該程式集的其他程式集都可以訪問該型別或成員。

private
只有同一類或結構中的程式碼可以訪問該型別或成員。

受保護
只有同一類或者從該類派生的類中的程式碼可以訪問該型別或成員。
internal
同一程式集中的任何程式碼都可以訪問該型別或成員,但其他程式集中的程式碼不可以。

受保護的內部 該型別或成員可由對其進行宣告的程式集或另一程式集中的派生類中的任何程式碼訪問。

專用受保護只有在其宣告程式集內,通過相同類中的程式碼或派生自該類的型別,才能訪問型別或成員。

下面的示例演示如何在型別和成員上指定訪問修飾符:

C#
public class Bicycle
{
    public void Pedal() { } } 

並非所有的訪問修飾符都可以由所有上下文中的所有型別或成員使用,並且在某些情況下,型別成員的可訪問性受其包含型別的可訪問性限制。 以下各節提供了有關可訪問性的更多詳細資訊。

類和結構可訪問性

在名稱空間內直接宣告(換句話說,不巢狀在其他類或結構中)的類和結構可以為公共或內部。 如果未指定任何訪問修飾符,則預設設定為內部。

結構成員(包括巢狀的類和結構)可以宣告為公共、內部或私有。 類成員(包括巢狀的類和結構)可以為公共、受保護的內部、受保護、內部、專用受保護或專用。 預設情況下,類成員和結構成員(包括巢狀的類和結構)的訪問級別為私有。 不能從包含型別的外部訪問私有巢狀型別。

派生類不能具有高於其基型別的可訪問性。 換而言之,不能具有派生自內部類 A 的公共類 B。 如果允許這樣,則它將具有使 A 公開的效果,因為可從派生類訪問 A 的所有受保護的或內部成員。

可以通過使用 InternalsVisibleToAttribute 啟用特定的其他程式集訪問內部型別。 有關詳細資訊,請參閱

友元程式集

類和結構成員可訪問性

可以使用六種訪問型別中的任意一種宣告類成員(包括巢狀的類和結構)。 結構成員無法宣告為受保護,因為結構不支援繼承。

通常情況下,成員的可訪問性不大於包含該成員的型別的可訪問性。 但是,如果內部類的公共成員實現了介面方法或替代了在公共基類中定義的虛擬方法,則可從該程式集的外部訪問該成員。

為欄位、屬性或事件的任何成員的型別必須至少與該成員本身具有相同的可訪問性。 同樣,為方法、索引器或委託的任何成員的返回型別和引數型別必須至少與該成員本身具有相同的可訪問性。例如,不能具有返回類 C 的公共方法 M,除非 C 也是公共的。 同樣,如果 A 宣告為私有,則不能具有型別 A 的受保護的屬性。

使用者定義的運算子始終必須宣告為公共。 有關詳細資訊,請參閱運算子(C# 參考)

終結器不能具有可訪問性修飾符。

若要設定類或結構成員的訪問級別,向成員宣告新增適當的關鍵字,如以下示例中所示。

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; } } } 

 備註

受保護的內部可訪問性級別意味著受保護或內部,而非受保護和內部。 換而言之,可以從同一程式集中的任何類(包括派生類)訪問受保護的內部成員。 若要將同一程式集中的可訪問性限制為僅派生類,請宣告類本身為內部,並宣告其成員為受保護。 此外,從 C# 7.2 開始,可以使用專用受保護的訪問修飾符實現相同的效果,而無需使包含的類屬於內部。

其他型別

在名稱空間內直接宣告的介面可以宣告為公共或內部,就像類和結構一樣,介面預設設定為內部訪問。 介面成員始終為公共的,因為介面的用途是啟用其他型別以訪問類或結構。 沒有訪問修飾符可以應用於介面成員。

列舉成員始終為公共的,並且不應用任何訪問修飾符。

委託類似於類和結構。 預設情況下,當在名稱空間內直接宣告它們時,它們具有內部訪問,當將它們巢狀在名稱空間內時,它們具有私有訪問。

C# 語言規範

有關詳細資訊,請參閱 C# 語言規範。 該語言規範是 C# 語法和用法的權威資料。

請參閱

from:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers