Können Sie in C # eine Klasse nur in ihrem eigenen Namespace sichtbar machen, ohne in einer anderen Assembly zu leben? Dies scheint nützlich für typische Hilfsklassen zu sein, die nicht anderweitig verwendet werden sollten. (dh was Java paketprivate Klassen nennt)
87
Antworten:
Ich denke nicht, dass das, was du willst, möglich ist.
quelle
Sie können die Klassen erstellen
internal
, dies verhindert jedoch nur, dass Personen außerhalb der Assembly die Klasse verwenden. Sie müssen jedoch für jeden Namespace, mit dem Sie dies tun möchten , eine separate Assembly erstellen. Ich gehe davon aus, dass Sie es deshalb nicht wollen würden .Den C # -Compiler dazu bringen, die Sichtbarkeit von Namespaces zu erzwingen
Hier gibt es einen Artikel ( Namespace-Sichtbarkeit in C # ), der eine Methode zur Verwendung von Teilklassen als Form eines "gefälschten Namespace" zeigt, die Sie möglicherweise hilfreich finden.
Der Autor weist darauf hin, dass dies nicht perfekt funktioniert und erörtert die Mängel. Das Hauptproblem ist, dass C # -Designer C # so entworfen haben, dass es nicht so funktioniert. Dies weicht stark von den erwarteten Codierungspraktiken in C # /. NET ab, was einer der größten Vorteile von .NET Frameworks ist.
Es ist ein ordentlicher Trick ... jetzt tu es nicht .
quelle
System.Net.Mime.MediaTypeNames.Application
Intern ist die Privatsphäre der Baugruppe (genau genommen Modul). Dies hat keine Auswirkungen auf die Sichtbarkeit von Namespaces.
Die einzige Möglichkeit, die Privatsphäre einer Klasse gegenüber anderen Klassen innerhalb derselben Assembly zu erreichen, besteht darin, dass eine Klasse eine innere Klasse ist.
Wenn die Klasse privat ist, ist sie zu diesem Zeitpunkt für alles unsichtbar, was nicht zu dieser Klasse oder zur äußeren Klasse selbst gehört.
Wenn es geschützt ist, ist es für alle sichtbar, die es privat sehen können, aber auch für Unterklassen der äußeren Klasse.
Im Wesentlichen besteht die einzige Möglichkeit, das zu erreichen, was Sie wünschen, darin, die äußere Klasse als Namespace zu verwenden und innerhalb dieser Klasse einzuschränken.
quelle
Wenn Sie eine einzelne Assembly haben, können Sie so viele Namespaces in dieser Assembly definieren, wie Sie möchten. Unabhängig davon, welchen Modifikator Sie in der IDE anwenden, können Sie die Klassen immer in anderen Namespaces anzeigen.
quelle
Ich bin mir nicht sicher, ob es direkt möglich ist, aber ein paar gute Möglichkeiten, es zu fälschen, wären:
1) Lassen Sie die Klassen, die solche Dinge benötigen, von einer einzelnen Klasse erben, die die Hilfsklasse als interne Klasse hat.
2) Verwenden Sie Erweiterungsmethoden und verweisen Sie dann nur auf die Erweiterungsmethoden im Namespace.
quelle