アクセス修飾子

# アクセス修飾子図

以下は、より制限的なものからよりアクセスしやすいものまで、ベン図のすべてのアクセス修飾子です:

アクセス修飾子 ダイアグラム
非公開
内部
保護
保護された内部
公開

詳細については、以下を参照してください。

# パブリック

public キーワードは、クラス (ネストされたクラスを含む)、プロパティ、メソッド、またはフィールドをすべての消費者が利用できるようにします:

public class Foo()
{
    public string SomeProperty { get; set; }

    public class Baz
    {
        public int Value { get; set; }
    }
}

public class Bar()
{
    public Bar()
    {
        var myInstance = new Foo();
        var someValue = foo.SomeProperty;
        var myNestedInstance = new Foo.Baz();
        var otherValue = myNestedInstance.Value;
    }        
}

# プライベート

private キーワードは、クラス内でのみ使用するプロパティ、メソッド、フィールド、およびネストされたクラスをマークします:

public class Foo()
{
    private string someProperty { get; set; }

    private class Baz
    {
        public string Value { get; set; }
    }

    public void Do()
    {
        var baz = new Baz { Value = 42 };
    }
}

public class Bar()
{
    public Bar()
    {
        var myInstance = new Foo();

        // Compile Error - not accessible due to private modifier
        var someValue = foo.someProperty;
        // Compile Error - not accessible due to private modifier
        var baz = new Foo.Baz();
    }
}

# 内部

internal キーワードは、クラス (ネストされたクラスを含む)、プロパティ、メソッド、またはフィールドを、同じアセンブリ内のすべてのコンシューマーが利用できるようにします:

internal class Foo
{
    internal string SomeProperty {get; set;}
}

internal class Bar
{
    var myInstance = new Foo();
    internal string SomeField = foo.SomeProperty;

    internal class Baz
    {
        private string blah;
        public int N { get; set; }
    }
}

AssemblyInfo.cs ファイルにコードを追加することで、テスト アセンブリがコードにアクセスできるようにするために、これを壊すことができます:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

# 保護

protected 同じクラスおよび派生クラス内でのみ使用するキーワード マーク フィールド、メソッド プロパティ、およびネストされたクラス:

public class Foo()
{
    protected void SomeFooMethod()
    {
        //do something
    }

    protected class Thing
    {
        private string blah;
        public int N { get; set; }
    }
}

public class Bar() : Foo
{
    private void someBarMethod()
    {
        SomeFooMethod(); // inside derived class
        var thing = new Thing(); // can use nested class
    }
}

public class Baz()
{
    private void someBazMethod()
    {
        var foo = new Foo();
        foo.SomeFooMethod(); //not accessible due to protected modifier
    }
}

# 保護された内部

protected internal 同じアセンブリ内または別のアセンブリ内の派生クラス内で使用するためのキーワード マーク フィールド、メソッド、プロパティ、およびネストされたクラス:

アセンブリ 1

public class Foo
{
    public string MyPublicProperty { get; set; }
    protected internal string MyProtectedInternalProperty  { get; set; }

    protected internal class MyProtectedInternalNestedClass
    {
        private string blah;
        public int N { get; set; }
    }
}

public class Bar
{
    void MyMethod1()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }
}

アセンブリ 2

public class Baz : Foo
{
    void MyMethod1()
    {
        var myPublicProperty = MyPublicProperty;
        var myProtectedInternalProperty = MyProtectedInternalProperty;
        var thing = new MyProtectedInternalNestedClass();
    }

    void MyMethod2()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;

        // Compile Error
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }

}

public class Qux
{
    void MyMethod1()
    {
        Baz baz = new Baz();
        var myPublicProperty = baz.MyPublicProperty;

        // Compile Error
        var myProtectedInternalProperty = baz.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Baz.MyProtectedInternalNestedClass();
    }

    void MyMethod2()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;

        //Compile Error
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }
}

# コメント

アクセス修飾子が省略された場合、

  • クラスはデフォルトで internal です
  • メソッドはデフォルト private によるものです
  • getter と setter は、プロパティの修飾子を継承します。デフォルトでは、これは private です。

プロパティのセッターまたはゲッターのアクセス修飾子は、アクセスを制限することはできますが、それを広げることはできません:public string someProperty {get; private set;}