802 Stimmen

Was ist in C# der Unterschied zwischen public, private, protected und ohne Zugriffsmodifikator?

Während meiner gesamten Studienzeit habe ich public und würde gerne den Unterschied zwischen public , private y protected ?

Und was bedeutet static tun, als nichts zu haben?

26voto

Narottam Goyal Punkte 3174

enter image description here

using System;

namespace ClassLibrary1
{
    public class SameAssemblyBaseClass
    {
        public string publicVariable = "public";
        protected string protectedVariable = "protected";
        protected internal string protected_InternalVariable = "protected internal";
        internal string internalVariable = "internal";
        private string privateVariable = "private";
        public void test()
        {
            // OK
            Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(publicVariable);

            // OK
            Console.WriteLine(protectedVariable);

            // OK
            Console.WriteLine(internalVariable);

            // OK
            Console.WriteLine(protected_InternalVariable);
        }
    }

    public class SameAssemblyDerivedClass : SameAssemblyBaseClass
    {
        public void test()
        {
            SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }

    public class SameAssemblyDifferentClass
    {
        public SameAssemblyDifferentClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // NOT OK
            // Console.WriteLine(privateVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            //Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }
}

 using System;
        using ClassLibrary1;
        namespace ConsoleApplication4

{
    class DifferentAssemblyClass
    {
        public DifferentAssemblyClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            // Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protectedVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protected_InternalVariable);
        }
    }

    class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
    {
        static void Main(string[] args)
        {
            DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            //Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);

            SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
            dd.test();
        }
    }
}

1 Stimmen

Ich sehe nicht, was diese Antwort den vielen anderen Antworten der letzten fünf Jahre voraus hat.

4 Stimmen

Dies ist nur eine einfache Erklärung. Die anderen Antworten sind etwas verwirrend und halb beantwortet :)

4 Stimmen

@John Saunders: Er unterscheidet, indem er die Sichtbarkeit für eine abgeleitete Klasse zwischen der Klasse in derselben und der Klasse in einer anderen Assembly trennt. Außerdem gibt er an, wie er zu diesen Informationen gekommen ist, indem er seinen Beispielcode zeigt. Er ergänzt also die anderen Antworten. Sein Nekromantismus wurde wahrscheinlich durch meinen Kommentar in meiner Antwort ausgelöst.

23voto

leppie Punkte 111830

Bezüglich der Frage der Nichts

  • Namensraumtypen sind standardmäßig intern
  • Jedes Typmitglied, einschließlich verschachtelter Typen, ist standardmäßig privat

12voto

CraigTP Punkte 42633

Hm.

Siehe hier: Zugriffsmodifikatoren .

Kurz und bündig:

Public gibt der Methode oder dem Typ vollständige Sichtbarkeit für andere Typen/Klassen.

Private erlaubt nur dem Typ, der die private Methode/Variable enthält, den Zugriff auf die private Methode/Variable (beachten Sie, dass verschachtelte Klassen auch Zugriff auf die privaten Methoden/Variablen der enthaltenen Klassen haben).

Protected ist ähnlich wie private, außer dass abgeleitete Klassen auch auf geschützte Methoden zugreifen können.

"Nothing" ist das VB.NET-Äquivalent zu null. Obwohl, wenn Sie sich auf "nichts" beziehen, was "kein Zugriffsmodifikator" bedeutet, dann kommt es darauf an, obwohl eine sehr grobe Faustregel (sicherlich in C#) ist, dass, wenn Sie nicht explizit einen Zugriffsmodifikator angeben, die Methoden-/Variablendeklaration in der Regel so ist eingeschränkt wie es sein kann. d.h.

public class MyClass
{
    string s = "";
}

ist praktisch dasselbe wie:

public class MyClass
{
    private string s = "";
}

Der verlinkte MSDN-Artikel bietet eine vollständige Beschreibung, wenn kein Zugriffsmodifikator explizit angegeben ist.

12voto

Tony Punkte 1654

öffentlich - kann von jedem und überall abgerufen werden.
privat - kann nur innerhalb der Klasse, zu der sie gehört, aufgerufen werden.
geschützt - kann nur von innerhalb der Klasse oder einem Objekt, das von der Klasse erbt, aufgerufen werden.

Nichts ist wie null, aber in VB.
Statisch bedeutet, dass Sie eine Instanz dieses Objekts haben, eine Methode für jede Instanz dieser Klasse.

5voto

gbianchi Punkte 2079

Hmmm...

Statisch bedeutet, dass Sie auf diese Funktion zugreifen können, ohne eine Instanz der Klasse zu besitzen.

Sie können direkt aus der Klassendefinition darauf zugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X