クラス、メソッド、メンバー、コンストラクター、デリゲート、およびインターフェースのデフォルトのアクセス修飾子は何ですか?
ベストアンサー1
C# のすべてのデフォルトのアクセスは、「そのメンバーに対して宣言できる最も制限されたアクセス」です。
たとえば次のようになります。
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
は以下と同等である
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
これに対する唯一の例外は、プロパティの一部 (通常はセッター) を、プロパティ自体の宣言されたアクセシビリティよりも制限することです。
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
C# 3.0 仕様では次のように述べられています (セクション 3.5.1):
メンバー宣言が行われるコンテキストに応じて、特定の種類の宣言されたアクセシビリティのみが許可されます。さらに、メンバー宣言にアクセス修飾子が含まれていない場合、宣言が行われるコンテキストによって、デフォルトの宣言されたアクセシビリティが決まります。
- 名前空間には暗黙的に public 宣言されたアクセシビリティがあります。名前空間宣言ではアクセス修飾子は許可されません。
- コンパイル単位または名前空間で宣言された型には、public または internal で宣言されたアクセシビリティを持たせることができ、デフォルトでは internal で宣言されたアクセシビリティになります。
- クラス メンバーは、宣言された 5 種類のアクセシビリティのいずれかを持つことができ、デフォルトではプライベート宣言されたアクセシビリティになります。(クラスのメンバーとして宣言された型は、宣言された 5 種類のアクセシビリティのいずれかを持つことができますが、名前空間のメンバーとして宣言された型は、パブリックまたは内部宣言されたアクセシビリティのみを持つことができることに注意してください。)
- 構造体のメンバーは、public、internal、または private と宣言されたアクセシビリティを持つことができ、構造体は暗黙的にシールされているため、デフォルトで private と宣言されたアクセシビリティになります。構造体に導入された (つまり、その構造体によって継承されていない) 構造体のメンバーは、protected または protected internal と宣言されたアクセシビリティを持つことはできません。(構造体のメンバーとして宣言された型は public、internal、または private と宣言されたアクセシビリティを持つことができますが、名前空間のメンバーとして宣言された型は public または internal と宣言されたアクセシビリティしか持つことができないことに注意してください。)
- インターフェース メンバーには暗黙的に public 宣言されたアクセシビリティがあります。インターフェース メンバー宣言ではアクセス修飾子は許可されません。
- 列挙メンバーには暗黙的に public 宣言されたアクセシビリティがあります。列挙メンバーの宣言ではアクセス修飾子は許可されません。
(ネストされた型は「クラス メンバー」または「構造体メンバー」の部分に含まれ、デフォルトでプライベートの可視性になることに注意してください。)