クラス、メソッド、メンバー、コンストラクター、デリゲート、およびインターフェイスのデフォルトのアクセス修飾子は何ですか?
9 に答える
C#のすべてのデフォルトのアクセスは、「そのメンバーに対して宣言できる最も制限されたアクセス」です。
したがって、たとえば:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
と同等です
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
これに対する1つの種類の例外は、プロパティの一部(通常はセッター)を、プロパティ自体の宣言されたアクセシビリティよりも制限することです。
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
これは、C#3.0仕様の内容です(セクション3.5.1)。
メンバー宣言が行われるコンテキストに応じて、特定のタイプの宣言されたアクセス可能性のみが許可されます。さらに、メンバー宣言にアクセス修飾子が含まれていない場合、宣言が行われるコンテキストによって、デフォルトで宣言されたアクセス可能性が決まります。
- 名前空間には、暗黙的にパブリック宣言されたアクセシビリティがあります。名前空間宣言では、アクセス修飾子は許可されていません。
- コンパイル単位または名前空間で宣言されたタイプは、パブリックまたは内部で宣言されたアクセシビリティを持ち、デフォルトで内部で宣言されたアクセシビリティになります。
- クラスメンバーは、5種類の宣言されたアクセシビリティのいずれかを持つことができ、デフォルトでプライベートの宣言されたアクセシビリティになります。(クラスのメンバーとして宣言された型は、5種類の宣言されたアクセシビリティのいずれかを持つことができますが、名前空間のメンバーとして宣言された型は、パブリックまたは内部で宣言されたアクセシビリティのみを持つことができます。)
- 構造体は暗黙的に封印されているため、構造体のメンバーは、パブリック、内部、またはプライベートの宣言されたアクセシビリティを持ち、デフォルトでプライベートの宣言されたアクセシビリティになります。構造体に導入された(つまり、その構造体に継承されていない)構造体メンバーは、内部で宣言されたアクセス可能性を保護または保護することはできません。(構造体のメンバーとして宣言された型は、パブリック、内部、またはプライベートの宣言されたアクセシビリティを持つことができますが、名前空間のメンバーとして宣言されたタイプは、パブリックまたは内部の宣言されたアクセシビリティのみを持つことができます。)
- インターフェイスメンバーは、暗黙的にパブリック宣言されたアクセシビリティを持っています。インターフェイスメンバーの宣言でアクセス修飾子を使用することはできません。
- 列挙型メンバーは、暗黙的にパブリック宣言されたアクセシビリティを持っています。列挙型メンバーの宣言では、アクセス修飾子は使用できません。
(ネストされた型は「クラスメンバー」または「構造体メンバー」の部分に含まれることに注意してください。したがって、デフォルトではプライベート可視性になります。)
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
(Microsoft URLが大好きな人...)
アクセス修飾子(C#プログラミングガイド)をご覧ください
クラスと構造体のアクセシビリティ
名前空間内で直接宣言されている(つまり、他のクラスまたは構造体内にネストされていない)クラスおよび構造体は、パブリックまたは内部のいずれかになります。アクセス修飾子が指定されていない場合、内部がデフォルトです。
ネストされたクラスや構造体を含む構造体メンバーは、パブリック、内部、またはプライベートとして宣言できます。ネストされたクラスと構造体を含むクラスメンバーは、public、protected internal、protected、internal、private protected、またはprivateにすることができます。ネストされたクラスと構造体を含む、クラスメンバーと構造体メンバーのアクセスレベルは、デフォルトでプライベートです。プライベートネストタイプは、包含タイプの外部からアクセスできません。
派生クラスは、基本タイプよりも優れたアクセシビリティを持つことはできません。つまり、内部クラスAから派生するパブリッククラスBを持つことはできません。これが許可された場合、Aの保護されたメンバーまたは内部メンバーはすべて、派生クラスからアクセスできるため、Aをパブリックにする効果があります。
を使用して、特定の他のアセンブリが内部タイプにアクセスできるようにすることができます
InternalsVisibleToAttribute
。詳細については、フレンドアセンブリを参照してください。クラスおよび構造体メンバーのアクセシビリティ
クラスメンバー(ネストされたクラスと構造体を含む)は、6種類のアクセスのいずれかで宣言できます。構造体は継承をサポートしていないため、構造体メンバーを保護対象として宣言することはできません。
通常、メンバーのアクセシビリティは、それを含むタイプのアクセシビリティよりも大きくはありません。ただし、内部クラスのパブリックメンバーは、メンバーがインターフェイスメソッドを実装するか、パブリックベースクラスで定義されている仮想メソッドをオーバーライドする場合、アセンブリの外部からアクセスできる可能性があります。
フィールド、プロパティ、またはイベントであるメンバーのタイプは、少なくともメンバー自体と同じくらいアクセス可能である必要があります。同様に、メソッド、インデクサー、またはデリゲートであるメンバーの戻り型とパラメーター型は、少なくともメンバー自体と同じくらいアクセス可能である必要があります。たとえば、Cもパブリックでない限り、クラスCを返すパブリックメソッドMを持つことはできません。同様に、Aがプライベートとして宣言されている場合、タイプAの保護されたプロパティを持つことはできません。
ユーザー定義の演算子は、常にパブリックおよび静的として宣言する必要があります。詳細については、演算子のオーバーロードを参照してください。
ファイナライザーにアクセシビリティ修飾子を含めることはできません。
その他のタイプ
名前空間内で直接宣言されたインターフェースは、パブリックまたは内部として宣言でき、クラスや構造体と同様に、インターフェースはデフォルトで内部アクセスになります。インターフェイスの目的は他のタイプがクラスまたは構造体にアクセスできるようにすることであるため、インターフェイスメンバーは常にパブリックです。インターフェイスメンバーにアクセス修飾子を適用することはできません。
列挙型メンバーは常にパブリックであり、アクセス修飾子を適用することはできません。
デリゲートは、クラスや構造体のように動作します。デフォルトでは、名前空間内で直接宣言された場合は内部アクセスがあり、ネストされた場合はプライベートアクセスがあります。
クラスはデフォルトで内部です。
- クラスメンバーはデフォルトでプライベートです。
インターフェイスはデフォルトで内部です。
インターフェイスメンバーはデフォルトでパブリックです。(インターフェースでは、メンバーへのアクセシビリティを指定することはできません。)
注:インターフェースのメンバーにアクセス指定子を指定しようとすると、コンパイルエラーが表示されます。
Structはデフォルトで内部です。
- 構造体メンバーはデフォルトでプライベートです。
ドキュメントのリンクを追加したいと思います。詳細については、こちらをご覧ください。
最も簡単な答えは次のとおりです。
C#のすべてのメンバーは、デフォルトで可能な限り最もアクセスしにくい修飾子を常に使用します。
そのため、アセンブリ内のすべてのトップレベルクラスはデフォルトで「内部」になっています。つまり、それらは所属するアセンブリに対してパブリックですが、プライベートであるか、外部アセンブリへのアクセスから除外されています。トップレベルクラスの他の唯一のオプションは、よりアクセスしやすいパブリックです。ネストされたタイプの場合、列挙型のメンバーやパブリックにしかできないインターフェイスなどのいくつかのまれな例外を除いて、すべてプライベートです。いくつかの例。トップレベルのクラスとインターフェイスの場合、デフォルトは次のとおりです。
クラス動物は内部クラスの動物と同じ
インターフェース動物パブリックインターフェース動物と同じ
ネストされたクラスとインターフェース(タイプ内)の場合、デフォルトは次のとおりです。
クラスアニマルプライベートクラスアニマルと同じ
インターフェース動物プライベートインターフェース動物と同じ
デフォルトが常に最もプライベートであると想定する場合は、デフォルトを変更する必要があるまで、アクセサーを使用する必要はありません。簡単。
名前空間レベル:internal
タイプレベル:private
内部はデフォルトの修飾子です