Szukaj…


Uwagi

Jeśli modyfikator dostępu zostanie pominięty,

  • klasy są domyślnie internal
  • metody są deault private
  • metody pobierające i ustawiające dziedziczą modyfikator właściwości, domyślnie jest on private

Modyfikatory dostępu do ustawiaczy lub pobierających właściwości mogą jedynie ograniczać dostęp, a nie rozszerzać go: public string someProperty {get; private set;}

publiczny

public słowo kluczowe udostępnia klasę (w tym klasy zagnieżdżone), właściwość, metodę lub pole każdemu konsumentowi:

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

prywatny

private słowo kluczowe oznacza właściwości, metody, pola i zagnieżdżone klasy do użytku wyłącznie w klasie:

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

wewnętrzny

Wewnętrzne słowo kluczowe udostępnia klasę (w tym klasy zagnieżdżone), właściwość, metodę lub pole każdemu konsumentowi w tym samym zestawie:

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

Można to zepsuć, aby umożliwić zespołowi testującemu dostęp do kodu poprzez dodanie kodu do pliku AssemblyInfo.cs:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

chroniony

protected pole znaczników słów kluczowych, właściwości metod i zagnieżdżone klasy do użytku tylko w tej samej klasie i klasach pochodnych:

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
    }
}

chronione wewnętrznie

protected internal słowo kluczowe oznacza pole, metody, właściwości i zagnieżdżone klasy do użytku wewnątrz tego samego zestawu lub klas pochodnych w innym zestawie:

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

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

Dostęp do diagramów modyfikatorów

Oto wszystkie modyfikatory dostępu na diagramach Venna, od bardziej ograniczających do bardziej dostępnych:

Modyfikator dostępu Diagram
prywatny prywatny
wewnętrzny wewnętrzny
chroniony chroniony
chronione wewnętrznie chronione wewnętrznie
publiczny publiczny

Poniżej możesz znaleźć więcej informacji.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow