web-dev-qa-db-ja.com

C#のデフォルトのアクセス修飾子は何ですか?

クラス、メソッド、メンバ、コンストラクタ、デリゲート、およびインタフェースのデフォルトのアクセス修飾子は何ですか?

327
Surya sasidhar

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種類のアクセシビリティのいずれかを持つことができますが、名前空間のメンバとして宣言された型は、パブリックまたは内部宣言されたアクセシビリティしか持てません。)
  • 構造体は暗黙的に封印されているため、public、internal、またはprivateとして宣言されたアクセシビリティを持ち、デフォルトで非公開で宣言されたアクセシビリティを持つことができます。構造体に導入された(つまり、その構造体によって継承されていない)構造体メンバーは、保護された保護された内部アクセス宣言済みアクセス可能性を持つことはできません。 (構造体のメンバとして宣言された型は、public、internal、またはprivateの宣言されたアクセシビリティを持つことができますが、名前空間のメンバとして宣言された型はpublicまたはinternalの宣言アクセシビリティのみを持つことができます。)
  • インタフェースメンバは暗黙のうちに宣言された公開ユーザ補助を持っています。インターフェイスメンバの宣言にはアクセス修飾子を使用できません。
  • 列挙型メンバーは、公に宣言されたユーザー補助機能を暗黙的に持っています。列挙型メンバーの宣言にはアクセス修飾子を使用できません。

(入れ子になった型は "クラスメンバ"または "構造体メンバ"部分の下に来ることに注意してください - そしてそれ故にデフォルトは私用可視性になります。)

423
Jon Skeet
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!
135
John Buchanan

簡単な答え:最小限のアクセス権(Jon Skeetの答えを参照)。

長い答え:

ネストされていない型、列挙型およびデリゲートのアクセシビリティのみが可能です。社内または公衆のアクセシビリティ

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

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    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

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/ja-jp/library/ba0a1yw2.aspx
http://msdn.Microsoft.com/en-us/library/ms173121.aspx
http://msdn.Microsoft.com/en-us/library/cx03xt0t.aspx
(マイクロソフトのURIが大好きな人...)

116
Ben

ご覧ください アクセス修飾子(C#プログラミングガイド)

クラスと構造体のアクセシビリティ
アクセス修飾子が指定されていない場合、internalがデフォルトです。

クラスと構造体メンバのアクセシビリティ
クラスメンバ(入れ子になったクラスや構造体を含む)は、5種類のアクセスのいずれでも宣言できます。構造体は継承をサポートしていないため、構造体メンバは保護されていると宣言することはできません。

メンバーのアクセシビリティは、その包含型のアクセシビリティよりも大きくなることはありません。

ユーザー定義演算子は常にpublicとして宣言する必要があります。詳しくは、operator(C#リファレンス)を参照してください。

デストラクタはアクセシビリティ修飾子を持つことはできません。

その他の種類
名前空間で直接宣言されたインターフェースはpublicまたはinternalとして宣言でき、クラスや構造体のように、インターフェースはデフォルトで内部アクセスになります。

列挙型メンバーは常にパブリックであり、アクセス修飾子を適用することはできません。

既定では、代理人は内部アクセス権を持ちます。

11
Adriaan Stander

ドキュメンテーションリンクを追加したいと思います。詳細をチェックしてください ここ

enter image description here

3
Asif Mushtaq

最も簡単な答えは次のとおりです.....

C#のすべてのメンバーは常にデフォルトでLEASTアクセシブル修飾子を使うことができます。

これが、アセンブリ内のすべての最上位クラスがデフォルトで「内部」である理由です。つまり、それらは、所属するアセンブリに対してパブリックであるが、プライベートであるか、外部のアセンブリへのアクセスから除外されます。トップレベルクラスのための他の唯一のオプションはよりアクセスしやすいパブリックです。ネストされた型の場合、enumのメンバーやpublicにしかなれないインターフェースなど、いくつかのまれな例外を除いて、すべてprivateです。いくつかの例。最上位クラスおよびインタフェースの場合、デフォルトは次のとおりです。

Animalクラスの動物Animalクラスの内部クラスと同じ

interface Animalpublic interface Animalと同じ

入れ子になったクラスとインタフェース(型の内側)の場合、デフォルトは次のとおりです。

クラスAnimalプライベートクラスAnimalと同じ

interface Animalprivate interface Animalと同じ

デフォルトが常に最もプライベートであると仮定しただけの場合は、デフォルトを変更する必要があるまでアクセサを使用する必要はありません。簡単です。

2
Stokely

クラスはデフォルトで内部です。

  • クラスメンバーはデフォルトでprivateです。

インターフェースはデフォルトで内部です。

  • インターフェースメンバーはデフォルトでpublicです。 (インターフェースでは、そのメンバーへのあらゆる種類のアクセシビリティを指定することはできません。)

    注:インターフェースのメンバーにアクセス指定子を指定しようとすると、コンパイルエラーが発生します。

構造体はデフォルトで内部です。

  • 構造体メンバは、デフォルトではprivateです。
1
Charming ZooZoo

Internalがデフォルトの修飾子です

1
renjucool

ネームスペースレベル:internal

型レベル:private

0
leppie