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
Antwort
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?
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
"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
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.
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.
vereinbart. Immer noch, wenn ich die Methode als intern markieren, kann ich es innerhalb der Versammlung verweisen. !! – Ravisha
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.
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.
Sehr geehrte andrew.Ich habe in der Frage mit Ausnahme der Schnittstelle und der Basisklasse erwähnt. – Ravisha
Heh ... das ist, was ich bekomme, wenn ich versuche, Fragen zu beantworten, während ein kleines Kind versucht, meine Maus zu stehlen ... –
Vielleicht ist es Zeit, dass Sie aufhören mit Mäusen zu spielen :) – Ravisha
- 1. Warum die explizite Implementierung einer Schnittstelle nicht öffentlich sein kann?
- 2. Warum InitializeComponent öffentlich ist
- 3. Warum behauptet der Typ System .__ ComObject (manchmal), öffentlich zu sein, wenn es nicht ist?
- 4. intern, öffentlich, statisch, außer Kraft setzen
- 5. Warum müssen ASP.NET MVC Controller-Klassen öffentlich sein?
- 6. Binding-Eigenschaft intern statt öffentlich in ViewModel machen
- 7. Warum ist java.io.Bits nicht öffentlich?
- 8. Warum ist das in C# nicht erlaubt?
- 9. Warum ist intern geschützt nicht restriktiver als intern?
- 10. Müssen virtuelle Destruktoren öffentlich sein?
- 11. Warum wird C++ nicht in const umgewandelt, wenn eine const-Methode öffentlich ist und die nicht-const-Methode geschützt ist?
- 12. Wie ist (,) intern definiert?
- 13. Warum kann ein explizit implementiertes Mitglied nicht öffentlich sein?
- 14. Sicherheit Auswirkungen der Zugriffsmodifikatoren (öffentlich, privat, intern, geschützt)
- 15. Java/Jython Hypothese: Konstruktor sollte öffentlich sein
- 16. Warum ist Drop erlaubt, auch wenn Effects = DragDropEffects.None gesetzt ist?
- 17. Klasse kann nicht intern definierte C++ - Klasse innerhalb Vorlage finden
- 18. Warum ist "do" in einer Funktion erlaubt?
- 19. Warum in C# ist dies nicht in Member-Initialisierer erlaubt, aber in VB.Net ist mir erlaubt
- 20. Warum Callback-Funktionen statisch sein müssen, wenn in Klasse
- 21. Warum erlaubt C# das Überschreiben von Asyncs?
- 22. C++ Äußerer Klassenzugriff Innere Klasse ist privat - Warum verboten?
- 23. Warum ist die Größe des Arrays als konstante Variable in C nicht erlaubt, aber in C++ erlaubt?
- 24. Wie erstellt man das Objekt, wenn der Konstruktor für die Klasse intern ist
- 25. Was ist C# "intern" in VB.net?
- 26. Warum ist "long" als Array-Länge in C# erlaubt?
- 27. Warum ist die Hauptmethode privat?
- 28. Auf Ruby, warum include ist privat und extend ist öffentlich?
- 29. Warum ist: = als Infix-Operator erlaubt?
- 30. Warum kann die erste Parameterliste einer Klasse nicht implizit sein?
Vielleicht gibt es keine Nebenwirkung, also wäre dies überflüssig. –
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