C#の既定のアクセス修飾子は何ですか?


384

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

回答:


486

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

(ネストされた型は「クラスメンバー」または「構造体メンバー」の部分に含まれることに注意してください-したがって、デフォルトではプライベートな可視性になります。)


154
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!

13
これは、クラスが(ネストされたタイプであるため)メンバーでもある場合、デフォルトでプライベートであることを明確にしません。また、インターフェースと列挙型のメンバーは常にパブリックです。
ジョンスキート

1
@niryいいえ、非公開ではありません。公開されています。それはちょうどそうであれば、実装タイプのスロットを得ることはありませんclass Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();あなたがアクセスすることはできません、Ma.M()しかし、あなたがそれにアクセスすることができ、(a as IFoo).M()。(仕様の詳細については、仕様を確認してください)
M.Stramm

130

短い回答:最小限のアクセス(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)

¹すべて=== public、protected、internal、private、protected internal

²構造体は、構造体またはクラスから継承することはできません(ただし、それらは継承できますが、インターフェース)。したがって、保護は有効な修飾子ではありません。

ネストされた型のアクセシビリティは、そのアクセシビリティドメインに依存します。アクセシビリティドメインは、メンバーの宣言されたアクセシビリティと直接含まれる型のアクセシビリティドメインの両方によって決定されます。ただし、ネストされた型のアクセシビリティドメインは、それを含む型のアクセシビリティドメインを超えることはできません。

注: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 URIが大好きです...)


12

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

クラスと構造のアクセシビリティ

名前空間内で直接宣言された(つまり、他のクラスまたは構造体内にネストされていない)クラスおよび構造体は、パブリックまたは内部のいずれかにすることができます。アクセス修飾子が指定されていない場合、デフォルトは内部です。

ネストされたクラスや構造体を含む構造体メンバーは、パブリック、内部、またはプライベートとして宣言できます。ネストされたクラスと構造体を含むクラスメンバーは、パブリック、内部保護、保護、内部、プライベート、プライベート、またはプライベートにすることができます。ネストされたクラスと構造体を含む、クラスメンバーと構造体メンバーのアクセスレベルは、デフォルトではプライベートです。ネストされたプライベートタイプには、包含タイプの外部からアクセスできません。

派生クラスは、その基本型よりも大きなアクセシビリティを持つことはできません。言い換えると、内部クラスAから派生するパブリッククラスBは使用できません。これが許可されている場合、Aのすべての保護メンバーまたは内部メンバーに派生クラスからアクセスできるため、Aをパブリックにする効果があります。

を使用して、他の特定のアセンブリが内部タイプにアクセスできるようにすることができますInternalsVisibleToAttribute。詳細については、「フレンドアセンブリ」を参照してください。

クラスと構造体メンバーのアクセシビリティ

クラスメンバー(ネストされたクラスと構造体を含む)は、6種類のアクセスのいずれかで宣言できます。構造体は継承をサポートしていないため、構造体メンバーは保護されていると宣言できません。

通常、メンバーのアクセシビリティは、それを含む型のアクセシビリティを超えません。ただし、メンバーがインターフェイスメソッドを実装したり、パブリック基本クラスで定義されている仮想メソッドをオーバーライドしたりすると、アセンブリの外部から内部クラスのパブリックメンバーにアクセスできる場合があります。

フィールド、プロパティ、またはイベントであるメンバーのタイプは、少なくともメンバー自体と同じくらいアクセス可能でなければなりません。同様に、メソッド、インデクサー、またはデリゲートであるメンバーの戻り値の型とパラメーター型は、少なくともメンバー自体と同じくらいアクセス可能でなければなりません。たとえば、Cもパブリックでない限り、クラスCを返すパブリックメソッドMを持つことはできません。同様に、Aがプライベートとして宣言されている場合、タイプAの保護プロパティを持つことはできません。

ユーザー定義の演算子は、常にpublicおよびstaticとして宣言する必要があります。詳細については、演算子のオーバーロードを参照してください。

ファイナライザは、アクセシビリティ修飾子を持つことができません。

他のタイプ

名前空間内で直接宣言されたインターフェイスは、パブリックまたは内部として宣言できます。クラスや構造体と同様に、インターフェイスはデフォルトで内部アクセスになります。インターフェイスの目的は、他の型がクラスまたは構造体にアクセスできるようにすることなので、インターフェイスメンバーは常にパブリックです。インターフェイスメンバーにアクセス修飾子を適用することはできません。

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

デリゲートは、クラスや構造体のように動作します。デフォルトでは、名前空間内で直接宣言された場合は内部アクセスがあり、ネストされた場合はプライベートアクセスがあります。


8

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

  • クラスのメンバーはデフォルトでプライベートです。

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

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

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

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

  • Structメンバーはデフォルトでプライベートです。

5

ドキュメントへのリンクを追加したいと思います。詳細はこちらをご覧ください

ここに画像の説明を入力してください


1
クラスはデフォルトでは内部であり、プライベートではありません。
Baahubali

1
クラスを書いた場所はプライベートですか?
Asif Mushtaq

このテーブルは、ネストされたタイプに対してのみ有効です。
BlueSilver 2017年

クラスはデフォルトで内部であり、名前空間内のクラスをプライベートにすることはできません。しかし、クラス(ネストされたクラス)内のクラスはプライベートにすることができます
Arun

インターフェースのアクセス修飾子はデフォルトで内部です。
カマラハンチナル

4

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

C#のすべてのメンバーは、常にデフォルトで可能な最小のアクセス可能な修飾子を取ります。

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

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

インターフェースアニマルパブリックインターフェースアニマルと同じ

ネストされたクラスとインターフェース(タイプ内)の場合、デフォルトは次のとおりです。

クラス動物プライベートクラス動物と同じ

インターフェースアニマルプライベートインターフェースアニマルと同じ

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.