Zoeken…


Opmerkingen

Als de toegangsmodificator wordt weggelaten,

  • klassen zijn standaard internal
  • methoden zijn door deault private
  • getters en setters nemen de modifier van de eigenschap over, dit is standaard private

Toegangsmodificaties op setters of getters van eigenschappen kunnen de toegang alleen beperken, niet verbreden: public string someProperty {get; private set;}

openbaar

Het public trefwoord maakt een klasse (inclusief geneste klassen), eigenschap, methode of veld beschikbaar voor elke consument:

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

privaat

Het private trefwoord markeert eigenschappen, methoden, velden en geneste klassen alleen voor gebruik binnen de klasse:

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

intern

Het interne trefwoord maakt een klasse (inclusief geneste klassen), eigenschap, methode of veld beschikbaar voor elke consument in dezelfde assembly:

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

Dit kan worden verbroken om een testassemblage toegang te geven tot de code door code toe te voegen aan het bestand AssemblyInfo.cs:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

beschermde

Het protected sleutelwoordmarkeringenveld, methodeneigenschappen en geneste klassen voor gebruik binnen dezelfde klasse en alleen afgeleide klassen:

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

beschermde intern

Het protected internal trefwoord markeert veld, methoden, eigenschappen en geneste klassen voor gebruik binnen dezelfde assemblage of afgeleide klassen in een andere assemblage:

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

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

Toegang modificaties diagrammen

Hier zijn alle toegangsmodificaties in venn-diagrammen, van beperkter tot toegankelijker:

Toegang Modifier Diagram
privaat privaat
intern intern
beschermde beschermde
beschermde intern beschermde intern
openbaar openbaar

Hieronder vindt u meer informatie.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow