サーチ…


備考

アクセス修飾子が省略されている場合、

  • クラスはデフォルトでinternal
  • メソッドはdeault private
  • gettersとsetterはプロパティの修飾子を継承しますが、デフォルトではprivate

setterまたはプロパティのgetter上のアクセス修飾子は、アクセスを制限するだけで、それを広げてはならないpublic string someProperty {get; private set;}

パブリック

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キーワードは、field、methodsプロパティ、およびネストされたクラスを、同じクラスおよび派生クラス内でのみ使用するようにマークします。

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();
    }
}

アクセス修飾子の図

より制限的なものからアクセス可能なものまで、すべてのアクセス修飾子があります。

アクセス修飾子
プライベートプライベート
内部内部
保護された保護された
保護された内部保護された内部
パブリックパブリック

あなたの下に、より多くの情報があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow