OK、これは私を悩ませています。
アクセス修飾子を指定しないメソッドのアクセシビリティレベルとは何ですか?
void Foo()
{
//code
}
internal
と言いたいのですが、100%よくわかりません。
typeのデフォルトのアクセシビリティはinternal
ですが、そのタイプのmembersのデフォルトのアクセシビリティはタイプによって異なります。
一般的に言えば、クラスのメンバーはデフォルトでprivate
ですが、structのメンバーはデフォルトでpublic
です。これは言語によって異なります。 C++のデフォルトの構造体アクセス修飾子はパブリックですが、C#の場合はプライベートです。
「.net」タグがあるので、これがC#メソッドであると想定します。
人々は、「メンバー」アクセシビリティと「クラス」アクセシビリティを区別する必要があります。
はい、internal
はクラスのデフォルトですが、private
はメンバーのデフォルトです。
クラスの場合:アクセス修飾子が指定されていない場合、デフォルトはInternalです。
メソッドの場合:アクセス修飾子が指定されていない場合、デフォルトはPrivateです。
FromThe C#Programming Language、Third Editionby Anders Hejlsberget al、section 10.3.5( "Class Members-Access Modifiers" )434ページ:
class-member-declarationには、宣言された5種類のアクセシビリティ(§3.5.1)のうちのいずれか1つを含めることができます(
public
、protected internal
、protected
、internal
、またはprivate
。protected internal
の組み合わせを除いて、複数のアクセス修飾子を指定するとコンパイル時エラーになります。 class-member-declarationにアクセス修飾子が含まれていない場合、private
が想定されます。[エンファシス鉱山]
次に、539ページのセクション11.2(「構造メンバー」)で次のように記述します。
§11.3に記載されている違いを除いて、§10.3から§10.14で提供されるクラスメンバーの説明は、構造体メンバーにも適用されます。
セクション11.3ではアクセス修飾子について何も触れられていないため、これを読んだところ、アクセス修飾子のないstruct
のメンバーもデフォルトでprivate
であることが示されています。これは MSDNの発言 と私の経験に対応しています。
あら、もう1つあります。
interface
メソッド宣言は当然のことながらpublic
です。したがって、次の実装は明示的なアクセス修飾子なしのpublic
です。
public class MyClass : IEqualityComparer<MyClass>
bool IEqualityComparer<MyClass>.Equals(MyClass x , MyClass y) {}
}
クラスメソッドはプライベートであり、.NETではデフォルトでシールされています。つまり、メソッドはクラス内でのみ表示され、継承されたクラスによってオーバーライドできません。