[英]What are the default access modifiers in C#?
類、方法、成員、構造函數、委托和接口的默認訪問修飾符是什么?
C# 中所有內容的默認訪問權限是“您可以為該成員聲明的最受限制的訪問權限” 。
例如:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
相當於
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
一種例外是使屬性的一部分(通常是 setter)比屬性本身聲明的可訪問性更受限制:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
這就是 C# 3.0 規范必須說的(第 3.5.1 節):
根據成員聲明發生的上下文,僅允許某些類型的聲明可訪問性。 此外,當成員聲明不包含任何訪問修飾符時,聲明發生的上下文決定了默認聲明的可訪問性。
- 命名空間隱含地具有公開聲明的可訪問性。 命名空間聲明中不允許使用訪問修飾符。
- 在編譯單元或命名空間中聲明的類型可以具有公共或內部聲明的可訪問性,並且默認為內部聲明的可訪問性。
- 類成員可以具有五種聲明的可訪問性中的任何一種,並且默認為私有聲明的可訪問性。 (請注意,聲明為類成員的類型可以具有五種聲明的可訪問性中的任何一種,而聲明為命名空間成員的類型只能具有公共或內部聲明的可訪問性。)
- 結構成員可以具有公共、內部或私有聲明的可訪問性,並且默認為私有聲明的可訪問性,因為結構是隱式密封的。 在結構中引入的結構成員(即不被該結構繼承)不能具有受保護或受保護的內部聲明的可訪問性。 (請注意,聲明為結構成員的類型可以具有公共、內部或私有聲明的可訪問性,而聲明為命名空間成員的類型只能具有公共或內部聲明的可訪問性。)
- 接口成員隱式地具有公開聲明的可訪問性。 接口成員聲明中不允許使用訪問修飾符。
- 枚舉成員隱含地具有公開聲明的可訪問性。 枚舉成員聲明中不允許使用訪問修飾符。
(請注意,嵌套類型將屬於“類成員”或“結構成員”部分 - 因此默認為私有可見性。)
top level class: internal method: private members (unless an interface or enum): private (including nested classes) members (of interface or enum): public constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined) delegate: internal interface: internal explicitly implemented interface member: public!
簡短回答:盡可能少的訪問(參見 Jon Skeet 的回答)。
長答案:
非嵌套類型、枚舉和委托可訪問性(可能只有內部或公共可訪問性)
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | public, internal interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
嵌套類型和成員可訪問性
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | All¹ interface | public | All¹ class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ enum member | public | none (always implicitly public) interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ 全部 === 公共、受保護、內部、私有、受保護內部
² 結構不能從結構或類繼承(盡管它們可以,接口),因此 protected 不是有效的修飾符
嵌套類型的可訪問性取決於其可訪問域,該域由成員聲明的可訪問性和直接包含類型的可訪問域共同決定。 但是,嵌套類型的可訪問域不能超過包含類型的可訪問域。
注意:CIL 還提供了受保護的和內部的(與現有的受保護的“或”內部相反),但據我所知,這目前不適用於 C#。
看:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(我喜歡微軟的 URL……)
類和結構可訪問性
直接在命名空間中聲明的類和結構(換句話說,不嵌套在其他類或結構中)可以是公共的或內部的。 如果未指定訪問修飾符,則默認為 Internal。
結構成員,包括嵌套類和結構,可以聲明為公共、內部或私有。 類成員,包括嵌套類和結構,可以是公共的、受保護的內部的、受保護的、內部的、私有的、受保護的或私有的。 默認情況下,類成員和結構成員(包括嵌套類和結構)的訪問級別是私有的。 不能從包含類型外部訪問私有嵌套類型。
派生類不能比它們的基類型具有更大的可訪問性。 換句話說,您不能擁有從內部類 A 派生的公共類 B。如果允許這樣做,則會產生使 A 成為公共的效果,因為 A 的所有受保護或內部成員都可以從派生類訪問。
您可以使用
InternalsVisibleToAttribute
啟用特定的其他程序集來訪問您的內部類型。 有關詳細信息,請參閱友元程序集。類和結構成員可訪問性
可以使用六種訪問類型中的任何一種來聲明類成員(包括嵌套類和結構)。 結構成員不能聲明為受保護的,因為結構不支持繼承。
通常,成員的可訪問性不大於包含它的類型的可訪問性。 但是,如果成員實現接口方法或覆蓋在公共基類中定義的虛擬方法,則可以從程序集外部訪問內部類的公共成員。
作為字段、屬性或事件的任何成員的類型必須至少與成員本身一樣可訪問。 同樣,作為方法、索引器或委托的任何成員的返回類型和參數類型必須至少與成員本身一樣可訪問。 例如,您不能有一個返回類 C 的公共方法 M,除非 C 也是公共的。 同樣,如果 A 被聲明為私有,則不能擁有 A 類型的受保護屬性。
用戶定義的運算符必須始終聲明為 public 和 static。 有關詳細信息,請參閱運算符重載。
終結器不能有可訪問性修飾符。
其他類型
直接在命名空間中聲明的接口可以聲明為公共的或內部的,就像類和結構一樣,接口默認為內部訪問。 接口成員始終是公共的,因為接口的目的是使其他類型能夠訪問類或結構。 不能將訪問修飾符應用於接口成員。
枚舉成員始終是公共的,並且不能應用訪問修飾符。
委托的行為類似於類和結構。 默認情況下,它們在命名空間中直接聲明時具有內部訪問權限,而嵌套時則具有私有訪問權限。
類默認為內部。
接口默認為內部。
默認情況下,接口成員是公共的。 (接口不允許我們為其成員指定任何類型的可訪問性。)
注意:如果您嘗試為接口的成員指定任何訪問說明符,則會顯示編譯錯誤。
結構默認為內部。
我想添加一些文檔鏈接。 在此處查看更多詳細信息。
最簡單的答案如下......
默認情況下,C# 中的所有成員始終采用 LEAST 可訪問修飾符。
這就是為什么程序集中的所有頂級類默認情況下都是“內部的”,這意味着它們對它們所在的程序集是公共的,但對外部程序集是私有的或被排除在外。 頂級課程的唯一其他選擇是更易於訪問的公共。 對於嵌套類型,它都是私有的,除了一些罕見的例外,比如只能是公共的枚舉成員和接口。 一些例子。 對於頂級類和接口,默認值為:
類 Animal與內部類Animal 相同
接口Animal與公共接口Animal相同
對於嵌套類和接口(內部類型),默認值為:
類 Animal與私有類Animal 相同
接口Animal與私有接口Animal相同
如果您只是假設 c# 類型的默認值始終是最私有的,那么您不需要使用自定義訪問器,直到您需要更改默認值。 它們開箱即用是安全的!
命名空間級別: internal
類型級別: private
內部是默認修飾符
internal
是 class 的默認訪問修飾符。
public
是 class 成員的默認訪問修飾符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.