800 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?

1094voto

mbillard Punkte 37218

Zugriffsmodifikatoren

De docs.microsoft.com :

public

Auf den Typ oder das Mitglied kann von jedem anderen Code in derselben oder einer anderen Baugruppe, die darauf verweist, zugegriffen werden.

private

Auf den Typ oder das Mitglied kann nur durch Code in derselben Klasse oder Struktur zugegriffen werden.

protected

Auf den Typ oder das Mitglied kann nur durch Code in derselben Klasse oder Struktur oder in einer abgeleiteten Klasse zugegriffen werden.

private protected (hinzugefügt in C# 7.2)

Auf den Typ oder das Mitglied kann nur durch Code in derselben Klasse oder Struktur oder in einer abgeleiteten Klasse aus derselben Assembly zugegriffen werden, nicht aber aus einer anderen Assembly.

internal

Auf den Typ oder das Mitglied kann von jedem Code in derselben Assembly zugegriffen werden, aber nicht von einer anderen Assembly.

protected internal

Auf den Typ oder das Mitglied kann von jedem Code in derselben Assembly oder von jeder abgeleiteten Klasse in einer anderen Assembly zugegriffen werden.

Wenn kein Zugriffsmodifikator gesetzt ist, wird ein Standardzugriffsmodifikator verwendet. Es gibt also immer irgendeine Form von Zugriffsmodifikator, auch wenn er nicht gesetzt ist.

static Modifikator

Der statische Modifikator einer Klasse bedeutet, dass die Klasse nicht instanziiert werden kann und dass alle ihre Mitglieder statisch sind. Ein statisches Mitglied hat eine Version, unabhängig davon, wie viele Instanzen seines umschließenden Typs erstellt werden.

Eine statische Klasse ist im Grunde dasselbe wie eine nicht-statische Klasse, aber es gibt einen Unterschied: eine statische Klasse kann nicht von außen instanziiert werden. Mit anderen Worten, Sie können das Schlüsselwort new nicht verwenden, um eine Variable des Klassentyps zu erstellen. Da es keine Instanzvariable gibt, greifen Sie auf die Mitglieder einer statischen Klasse zu, indem Sie den Klassennamen selbst verwenden.

Es gibt jedoch so etwas wie eine statischer Konstruktor . Jede Klasse kann eine davon haben, auch statische Klassen. Sie können nicht direkt aufgerufen werden und haben keine Parameter (außer den Typparametern der Klasse selbst). Ein statischer Konstruktor wird automatisch aufgerufen, um die Klasse zu initialisieren, bevor die erste Instanz erstellt wird oder auf statische Mitglieder verwiesen wird. Sieht so aus:

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

Statische Klassen werden oft als Dienste verwendet, Sie können sie wie folgt verwenden:

MyStaticClass.ServiceMethod(...);

19 Stimmen

Und Sie können statische Methoden in nicht-statischen Klassen haben, richtig?

15 Stimmen

Ja, sie würden sich genauso verhalten wie in meinem Beispiel.

9 Stimmen

Was bedeutet der Begriff "Versammlung" in diesem Zusammenhang?

208voto

Stefan Steiger Punkte 72861

Ein grafischer Überblick (Zusammenfassung auf den Punkt gebracht)

Visibility

Eigentlich ist es etwas komplizierter als das.
Jetzt (ab C# 7.2) gibt es auch private protected, und es spielt eine Rolle, ob eine abgeleitete Klasse in der gleichen Assembly ist oder nicht.

Die Übersicht muss also erweitert werden:

Visibility expanded

Siehe auch die C#-dotnet-docs zu diesem Thema .

Seit statische Klassen versiegelt sind, können sie nicht vererbt werden (außer von Object), so dass das Schlüsselwort protected für statische Klassen ungültig ist.

Für die Standardeinstellungen, wenn Sie keinen Zugriffsmodifikator vorangestellt haben, siehe hier:
Standardsichtbarkeit für C#-Klassen und -Mitglieder (Felder, Methoden usw.)?

Nicht verschachtelt

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

Verschachtelt:

nested enum      public
nested interface public
nested class     private
nested struct    private

Außerdem gibt es das sealed-keyword, das eine Klasse nicht vererbbar macht.
Außerdem sind die Schlüsselwörter in VB.NET manchmal unterschiedlich, daher hier ein Spickzettel:

VB vs. CS equivalents

1 Stimmen

@n BrtiL: Sind Sie sicher? Eine abgeleitete Klasse in einer anderen Assembly ?

0 Stimmen

Abgeleitete Klasse in der gleichen Baugruppe können wir, andere können wir nicht. Ich dachte, Sie meinten wie in der gleichen Baugruppe...

1 Stimmen

@n BrtiL: Hmm, richtig, das sollte eigentlich geschlüpft werden.

167voto

JosephStyons Punkte 55410

Öffentlich - Wenn Sie die Klasse sehen können, können Sie auch die Methode sehen

Privat - Wenn Sie Teil von die Klasse, dann können Sie die Methode sehen, sonst nicht.

Geschützt - Wie bei Privat, plus alle Nachkommen kann auch die Methode sehen.

Statisch (Klasse) - Erinnern Sie sich an die Unterscheidung zwischen "Klasse" und "Objekt"? Vergessen Sie das alles. Sie sind dasselbe mit "static"... die Klasse ist die einzige Instanz von sich selbst.

Statisch (Methode) - Wann immer Sie diese Methode verwenden, hat sie einen Bezugsrahmen, der unabhängig von der tatsächlichen Instanz der Klasse ist, zu der sie gehört.

1 Stimmen

Kann man nicht statische Methoden in einer nicht statischen Klasse haben, obwohl?

1 Stimmen

Ja, aber ich habe von einer statischen Klasse gesprochen. Ich habe einen separaten Eintrag hinzugefügt, um statische Methoden zu beschreiben. Danke für den Hinweis.

2 Stimmen

Objekt' ist vielleicht nicht der richtige Begriff, wenn es um C# geht, denn der Basistyp für alle Klassen ist System.Objekt . Instanz" wäre ein besseres Wort, oder "Objekt" (Kleinbuchstabe "O").

57voto

Paul Punkte 4796

Wiederveröffentlichung der großartigen Diagramme von diese Antwort .

Hier sind alle Zugangsmodifikatoren in Venn-Diagrammen dargestellt, von eher einschränkend bis hin zu eher promiskuitiv:

private :
enter image description here

private protected : - hinzugefügt in C# 7.2
enter image description here

internal :
enter image description here

protected :
enter image description here

protected internal :
enter image description here

public :
enter image description here

42voto

user1810087 Punkte 4876

Ein weiterer visueller Ansatz der aktuellen Zugriffsmodifikator (C# 7.2). Hoffentlich hilft das Schema, es sich leichter zu merken
(Klicken Sie auf das Bild für eine interaktive Ansicht.)

interactive access modifiers svg

Außen Innen

Wenn Sie Schwierigkeiten haben, sich an die zweisprachigen Zugangsmodifikatoren zu erinnern, denken Sie daran außen-innen .

  • privat geschützt : privat außerhalb (dieselbe Baugruppe) geschützt innerhalb (dieselbe Versammlung)
  • geschützt intern : geschützt außerhalb (dieselbe Baugruppe) intern innerhalb (dieselbe Versammlung)

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