Sök…


Anmärkningar

Om åtkomstmodifieraren utelämnas,

  • klasser är som standard internal
  • metoder är av deault private
  • getters och setters ärver modifieringen av fastigheten, som standard är detta private

Tillgångsmodifierare på bostäder eller getters av egenskaper kan bara begränsa åtkomst, inte bredda det: public string someProperty {get; private set;}

offentlig

Det public nyckelordet gör en klass (inklusive kapslade klasser), egendom, metod eller fält tillgängligt för varje konsument:

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

privat

Det private nyckelordet markerar egenskaper, metoder, fält och kapslade klasser för användning endast i klassen:

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

inre

Det interna nyckelordet gör en klass (inklusive kapslade klasser), egendom, metod eller fält tillgängligt för varje konsument i samma enhet:

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

Detta kan brytas så att en testenhet kan komma åt koden genom att lägga till kod i AssemblyInfo.cs-filen:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

skyddade

Det protected nyckelordet markerar fältet, metodegenskaper och kapslade klasser för användning inom samma klass och härledda klasser:

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

skyddad intern

Det protected internal nyckelordet markerar fält, metoder, egenskaper och kapslade klasser för användning i samma enhet eller härledda klasser i en annan enhet:

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

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

Få åtkomst till modifieringsdiagram

Här är alla åtkomstmodifierare i venndiagram, från mer begränsande till mer tillgängliga:

Access Modifier Diagram
privat privat
inre inre
skyddade skyddade
skyddad intern skyddad intern
offentlig offentlig

Nedan kan du hitta mer information.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow