web-dev-qa-db-ja.com

アクセス修飾子のないメソッド

OK、これは私を悩ませています。

アクセス修飾子を指定しないメソッドのアクセシビリティレベルとは何ですか?

void Foo()
{
    //code
} 

internalと言いたいのですが、100%よくわかりません。

42
Leroy Jenkins

typeのデフォルトのアクセシビリティはinternalですが、そのタイプのmembersのデフォルトのアクセシビリティはタイプによって異なります。

一般的に言えば、クラスのメンバーはデフォルトでprivateですが、structのメンバーはデフォルトでpublicです。これは言語によって異なります。 C++のデフォルトの構造体アクセス修飾子はパブリックですが、C#の場合はプライベートです。

45
Steve Guidi

「.net」タグがあるので、これがC#メソッドであると想定します。

人々は、「メンバー」アクセシビリティと「クラス」アクセシビリティを区別する必要があります。

18
Minyu

はい、internalはクラスのデフォルトですが、privateはメンバーのデフォルトです。

17
EMP

クラスの場合:アクセス修飾子が指定されていない場合、デフォルトはInternalです。

メソッドの場合:アクセス修飾子が指定されていない場合、デフォルトはPrivateです。

9
Secko

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つを含めることができます(publicprotected internalprotectedinternal、またはprivateprotected internalの組み合わせを除いて、複数のアクセス修飾子を指定するとコンパイル時エラーになります。 class-member-declarationにアクセス修飾子が含まれていない場合、privateが想定されます。[エンファシス鉱山]

次に、539ページのセクション11.2(「構造メンバー」)で次のように記述します。

§11.3に記載されている違いを除いて、§10.3から§10.14で提供されるクラスメンバーの説明は、構造体メンバーにも適用されます。

セクション11.3ではアクセス修飾子について何も触れられていないため、これを読んだところ、アクセス修飾子のないstructのメンバーもデフォルトでprivateであることが示されています。これは MSDNの発言 と私の経験に対応しています。

7
Daniel Pryden

あら、もう1つあります。

interfaceメソッド宣言は当然のことながらpublicです。したがって、次の実装は明示的なアクセス修飾子なしのpublicです。

public class MyClass : IEqualityComparer<MyClass>
    bool IEqualityComparer<MyClass>.Equals(MyClass x , MyClass y) {}
}
4
radarbob

これにより、MSDNから直接スクリーンショットに従ってすべてが明確になることを願っています

enter image description here

0
pixel

クラスメソッドはプライベートであり、.NETではデフォルトでシールされています。つまり、メソッドはクラス内でのみ表示され、継承されたクラスによってオーバーライドできません。

0
HaohaoLin