Ricerca…


Osservazioni

Se il modificatore di accesso è omesso,

  • le classi sono di default internal
  • i metodi sono per private
  • i getter e i setter ereditano il modificatore della proprietà, per impostazione predefinita questo è private

I modificatori di accesso su setter o getter di proprietà possono limitare l'accesso, non public string someProperty {get; private set;} : public string someProperty {get; private set;}

pubblico

La parola chiave public rende una classe (comprese le classi nidificate), proprietà, metodi o campi disponibili per ogni consumatore:

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

privato

La parola chiave private contrassegna proprietà, metodi, campi e classi nidificate per l'uso solo all'interno della classe:

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

interno

La parola chiave internal rende una classe (incluse le classi nidificate), proprietà, metodi o campi disponibili per ogni utente nello stesso 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; }
    }
}

Questo può essere interrotto per consentire a un assembly di test di accedere al codice aggiungendo il codice al file AssemblyInfo.cs:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

protetta

La parola chiave protected segna il campo, le proprietà dei metodi e le classi nidificate per l'uso solo all'interno della stessa classe e delle classi derivate:

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

protetto interno

La parola chiave protected internal contrassegna il campo, i metodi, le proprietà e le classi nidificate per l'uso all'interno dello stesso assembly o delle classi derivate in un altro assembly:

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

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

Access Modifiers Diagrams

Ecco tutti i modificatori di accesso nei diagrammi di Venn, da più limitanti a più accessibili:

Modificatore d'accesso Diagramma
privato privato
interno interno
protetta protetta
protetto interno protetto interno
pubblico pubblico

Qui sotto puoi trovare maggiori informazioni.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow