2010-02-15 5 views
8

Ich habe eine Klasse, die ich als intern markiert und ich Felder und Methoden als öffentlich markiert. Es kompiliert ohne Fehler oder Warnungen. Gibt es spezielle Anforderungen für Methoden wie public und class als intern (außer wenn sie von Interfaces oder Klassen implementiert werden)?Warum C# erlaubt Methoden/Mitglieder öffentlich sein, wenn die Klasse intern ist

+0

Vielleicht gibt es keine Nebenwirkung, also wäre dies überflüssig. –

+0

Ja, ich stimme zu, es gibt keine Nebenwirkung, aber meine Frage selbst war, ob es einen bestimmten Anwendungsfall gibt, in dem dies nützlich wird. – Ravisha

Antwort

8

Es hat keine negativen Auswirkungen und bedeutet auch, dass Sie die Barrierefreiheit Ihrer Mitglieder nicht ändern müssen, wenn Sie sich jemals dafür entscheiden, den Typ öffentlich zu machen.

Grundsätzlich für ein Mitglied:

  • Öffentlichkeit bedeutet, dass das Mitglied für jeden sichtbar ist, die die Art sehen.

  • intern bedeutet, dass das Element nur in der aktuellen Baugruppe sichtbar ist, auch wenn der Typ öffentlich sichtbar ist.

Also Ihre Wahl würde darauf basieren, welche von diesen am besten geeignet ist. Im Allgemeinen ist es am geeignetsten, die Mitglieder öffentlich zu machen (d. H. Sichtbar für jeden, der den Typ sehen kann, d. H. Einen Teil der öffentlichen API des Typs). Sie würden Mitglieder aus demselben Grund intern machen, aus dem Sie Mitglieder in einer öffentlichen Klasse intern machen - typischerweise Helfer-Mitglieder, die nur für "Freund" -Klassen in derselben Assembly sichtbar sein sollten und nicht Teil der öffentlichen API sind.

Darüber hinaus kann ein interner Type von einem öffentlichen Typ abgeleitet werden, sodass er öffentliche Member erben und überschreiben kann. Wäre es sinnvoll, übergeordnete öffentliche Mitglieder zuzulassen, aber keine neuen öffentlichen Mitglieder?

+0

Schöne Erklärung Joe, gibt es andere Verwendung (abgesehen "Wenn Sie sich jemals dafür entscheiden, den Typ öffentlich zu machen, müssen Sie die Zugänglichkeit Ihrer Mitglieder nicht ändern.") Damit Methoden öffentlich und intern typisiert werden? – Ravisha

+0

"Gibt es andere Verwendung" - es gibt keinen Unterschied. Also würde ich generell Mitglieder veröffentlichen, wenn es keinen ausdrücklichen Grund gibt, sie intern zu machen, dh wenn sie für einen öffentlichen Typ intern sind (normalerweise Helfer-Mitglieder, die nicht in der öffentlichen API sichtbar sein sollten, aber für "Freund" -Klassen zugänglich sind) in der gleichen Versammlung. – Joe

5

Eine Klasse, die als intern mit öffentlichen Methoden markiert ist, würde es anderen Klassen in derselben Assembly ermöglichen, auf diese Methoden zu verweisen.

internal (C# Reference)

Eine gemeinsame Nutzung des internen Zugriff ist in komponentenbasierte Entwicklung, weil es eine Gruppe von Komponenten zu in einem privaten Weise zusammenwirken kann, ohne zu dem Rest der Anwendung ausgesetzt wurde Code. Zum Beispiel könnte ein Framework für die Erstellung von grafischen Benutzer Interfaces Control und Form-Klassen bieten, die zusammenarbeiten mit Mitglieder mit internem Zugriff. Da diese Mitglieder intern sind, sind sie nicht mit Code ausgesetzt, der das Framework verwendet.

Es ist ein Fehler, einen Typen oder ein Mitglied mit internem Zugriff außerhalb der Anordnung, in der es definiert referenzieren.

bearbeiten

Von Scope of internal method in C#?

Sie können eine Methode auf einem öffentlichen Klasse wollen, die von anderen Klassen in der Versammlung aufgerufen werden kann, aber nicht durch Kunden der Versammlung.

+0

vereinbart. Immer noch, wenn ich die Methode als intern markieren, kann ich es innerhalb der Versammlung verweisen. !! – Ravisha

1

Es gibt keine Warnung, da es keine nachteiligen Auswirkungen hat. Die Mitglieder sind ohnehin nicht von anderen Versammlungen zugänglich, unabhängig davon, ob Sie sie als öffentlich oder intern markieren.

0

Betrachten wir diesen Fall:

Sie haben eine FooFactory Objekte Implementierung IFoo zu schaffen. Ihre IFoo-Implementierungen sind möglicherweise intern, da Sie sie nicht anderen Assemblys zugänglich machen möchten, die nur IFoo verwenden. Die Mitglieder der IFoo-Implementierung müssen öffentlich sein, damit sie in den anderen Assemblys verwendet werden können.

Also, wie ich jetzt alle Ihre Frage gelesen habe, glaube ich nicht, es gibt keinen Grund für Methoden auf interne Klassen öffentlich sein, es sei denn, es gibt einen Weg für diese Klassen von anderen Baugruppen entweder über Schnittstellen oder zugegriffen werden Basisklassen.

+0

Sehr geehrte andrew.Ich habe in der Frage mit Ausnahme der Schnittstelle und der Basisklasse erwähnt. – Ravisha

+0

Heh ... das ist, was ich bekomme, wenn ich versuche, Fragen zu beantworten, während ein kleines Kind versucht, meine Maus zu stehlen ... –

+0

Vielleicht ist es Zeit, dass Sie aufhören mit Mäusen zu spielen :) – Ravisha

Verwandte Themen