intern gegen öffentlich in c #

92

Ich möchte den Unterschied zwischen den Modifikatoren publicund den internalSichtbarkeitsmodifikatoren kennen.

Wann internalund wann sollten wir eine Klasse verwenden public? Ich bin verwirrt, wann eine Methode sein sollte publicoder internal.

Ich habe gelesen, dass internalder Zugriff über die Assembly möglich ist, während er publicauch über die Assembly verwendet werden kann, in der der Unterschied liegt.

NoviceToDotNet
quelle

Antworten:

101

public ist von überall sichtbar.

internal ist nur innerhalb einer Baugruppe sichtbar

Sie verwenden nur interne APIs, um interne APIs zu schützen. Sie können beispielsweise mehrere Überladungen einer Methode verfügbar machen:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Beide rufen die interne Methode auf

internal int Add(int[] numbers)

Sie können einer Methode dann viel Raffinesse verleihen, sie jedoch mithilfe von Fassadenmethoden "schützen", die dem Programmierer helfen können, die Methode korrekt aufzurufen. (Die Implementierungsmethode mit dem Array-Parameter kann beispielsweise eine beliebige Grenze von Werten haben.)

Erwähnenswert ist auch, dass mit Reflection alle Methoden unabhängig von ihrer Sichtbarkeit aufgerufen werden können. Ein weiterer "Hack" zur Steuerung / zum Zugriff auf intern versteckte APIs.

Program.X
quelle
5
Kann ich in einer internen Klasse die öffentlichen Methoden deklarieren?
NoviceToDotNet
Nein, da dies zu einem Konflikt führen würde. Der Compiler wird Sie darüber informieren und kann nicht kompilieren.
Program.X
14
@ Program.X: Eigentlich kannst du und der Compiler sagt dir nichts.
ODER Mapper
Eigentlich bin ich hierher gekommen und habe gegoogelt, ob dies tatsächlich eine Funktion ist oder nicht. Stellen Sie sich vor, Sie machen die Klasse internalund alle Methoden public. Wenn Sie eine höhere Sichtbarkeit benötigen, können Sie die gesamte Klasse publicerneut einstellen . Ich bin mir aber nicht sicher, ob es so verwendet werden soll oder nicht. Also google ich weiter ... edit Et voilà, gleiches Thema: stackoverflow.com/questions/9302236/…
ecth
31

internalist nützlich, wenn Sie ein Mitglied deklarieren oder innerhalb einer DLL eingeben möchten, nicht außerhalb dieser ...
normalerweise, wenn Sie ein Mitglied als deklarierenPublic Sie von anderen DLLs darauf zugreifen können. Wenn Sie jedoch etwas in Ihrer Klassenbibliothek als öffentlich deklarieren müssen, können Sie es als deklarieren Internal.
in formeller Verteidigung: Interne Mitglieder sind direkt in der aktuellen Versammlung sichtbar ...

Dr. TJ
quelle
11

internalist auch nützlich, wenn Sie Unit-Tests schreiben. Mit dem InternalsVisibleToAttribut kann Ihre Testassembly auf interne Methoden in Ihrer Code-Assembly zugreifen. Das heißt, Sie können Methoden testen, die für die Außenwelt privat erscheinen, ohne Reflexion zu verwenden.

Brian Rasmussen
quelle
6

Auf die Öffentlichkeit kann auch außerhalb der Versammlung zugegriffen werden. Wenn Sie also eine Klasse haben, auf die nicht zugegriffen werden sollte, sollte jede Klasse in der Assembly darauf zugreifen können, dann ist intern das Richtige. Wenn Sie Zugriff von außen benötigen, verwenden Sie public.

Tomas Jansson
quelle
4

Außerdem werden Eigenschaften, die als markiert internalsind, ausgelöst, BindingExpression path errorwenn sie für die Datenbindung in WPF verwendet werden. Diese müssen also vorhanden sein public, damit sie ordnungsgemäß funktionieren, auch wenn die Datenbindung in derselben Assembly erfolgt.

M463
quelle
-3

Wenn Sie das Assemble von außen referenzieren können, haben Sie den Umfang interner und öffentlicher Klassen

Leroy.P
quelle