Singleton in C# "unzugänglich", wenn nicht im gleichen Namespace?
-
22-10-2019 - |
Frage
Ich habe versucht, eine Singleton -Klasse auf folgende Weise zu implementieren (ich verwende VS2008 SP1):
namespace firstNamespace
{
class SingletonClass
{
private SingletonClass() {}
public static readonly SingletonClass Instance = new SingletonClass();
}
}
Wenn ich aus einer Klasse in einem anderen Namespace darauf zugreifen möchte (es scheint, dass dies das Problem ist, funktioniert es im gleichen Namespace) wie:
namespace secondNamespace
{
...
firstNamespace.SingletonClass inst = firstNamespace.SingletonClass.Instance;
...
}
Ich bekomme einen Compiler -Fehler:
error CS0122: 'firstNamespace.SingletonClass' is inaccessible due to its protection level
Hat jemand eine Idee, wie er das lösen kann?
Vielen Dank im Voraus!
Lösung
Ihnen fehlt das Schlüsselwort public
aus Ihrer Klassendefinition.
Andere Tipps
Klingt eher nach dem Singleton in einer anderen Versammlung. Der Standardmodifikator für eine Klasse ist intern und nur in der Baugruppe zugänglich.
Die Singletonclass hat eine interne Sichtbarkeit. Wenn sich also die beiden Namespaces in verschiedenen Baugruppen befinden, ist die gesamte Klasse in nicht zugänglich.
Veränderung
class SingletonClass
zu
public class SingletonClass
Rückgeld
class SingletonClass
zu
public class SingletonClass
um es öffentlich zu markieren, so zugänglich
oder noch besser:
public sealed class SingletonClass
Da sind die Mitglieder statisch:
Du Klasse SingletonClass
ist in anderen Namespaces sichtbar. In anderen Versammlungen/Projekten ist es jedoch nicht sichtbar.
Ihre Klasse ist privat. Dies bedeutet, dass jeder Code in Ihrem aktuellen Projekt (= Assembly = .dll) diese Klasse sehen kann. Die Klasse ist jedoch für Code in anderen Projekten versteckt.
Es besteht eine schwache Korrelation zwischen dem Namespace und der Baugruppe. Ein Namespace kann in mehreren Baugruppen vorhanden sein, z. B. mscorlib.dll und system.dll beide enthalten den System -Namespace.
Wenn Sie jedoch ein neues Projekt in Visual Studio erstellen, erhalten Sie normalerweise einen neuen Namespace.
Sie können der einen Baugruppe auch mehrere Namespaces hinzufügen. Dies geschieht automatisch in Visual Studio, wenn Sie einen neuen Ordner erstellen.
Sie Singletonklasse Klasse ist nicht öffentlich, ist also außerhalb der nicht sichtbar Namespace Montage.
Korrektur: Die Kommentare sind richtig, wie sagt msdn:
Klassen und Strukturen, die nicht in anderen Klassen oder Strukturen verschachtelt sind, können entweder öffentlich oder intern sein. Ein als öffentlich deklarierter Typ ist von jedem anderen Typ zugänglich. Ein als intern deklarierter Typ ist nur nach Typen innerhalb derselben Baugruppe zugänglich. Klassen und Strukturen werden standardmäßig als intern deklariert, es sei denn, das Keyword Public wird der Klassendefinition hinzugefügt, wie im vorherigen Beispiel. Klassen- oder Strukturdefinitionen können das interne Schlüsselwort hinzufügen, um ihre Zugriffsebene explizit zu gestalten. Zugriffsmodifikatoren beeinflussen weder die Klasse noch die Struktur selbst - sie hat immer Zugriff auf sich selbst und alle eigenen Mitglieder.