Singleton in C # “inaccessibile” quando non nello stesso namespace?
-
22-10-2019 - |
Domanda
Ho cercato di implementare una classe Singleton nel modo seguente (io uso VS2008 SP1):
namespace firstNamespace
{
class SingletonClass
{
private SingletonClass() {}
public static readonly SingletonClass Instance = new SingletonClass();
}
}
Quando ho voglia di accedervi da una classe in uno spazio dei nomi diverso (sembra che questo è il problema, nello stesso spazio dei nomi funziona) come:
namespace secondNamespace
{
...
firstNamespace.SingletonClass inst = firstNamespace.SingletonClass.Instance;
...
}
ottengo un errore di compilazione:
error CS0122: 'firstNamespace.SingletonClass' is inaccessible due to its protection level
Qualcuno ha un'idea di come risolvere questo?
Molte grazie in anticipo!
Soluzione
Ti manca la parola public
dalla definizione della classe.
Altri suggerimenti
Suoni più come il Singleton è in un assembly diverso. Il modificatore predefinito per una classe è interna e quindi accessibile solo nell'assieme.
Il SingletonClass ha visibilità interna, quindi se i due namespace sono in diversi assiemi, l'intera classe in inaccessibili.
Cambia
class SingletonClass
a
public class SingletonClass
cambia
class SingletonClass
a
public class SingletonClass
per contrassegnare pubblico, quindi accessibile
o meglio ancora:
public sealed class SingletonClass
poiché i membri sono statici:
classe SingletonClass
è visibile in altri spazi dei nomi. Ma non è visibile in altre Assemblee / Progetti.
La classe è privato. Ciò significa che tutti codice nel tuo progetto corrente (= Assembly = dll) possono vedere questa classe. La classe è comunque nascosto per il codice in altri progetti.
Esiste una debole correlazione tra lo spazio e l'assieme. Uno spazio può esistere in più assiemi, ad esempio mscorlib.dll e System.dll entrambi contenere il namespace System.
Ma normalmente, quando si crea un nuovo progetto in Visual Studio, si ottiene un nuovo spazio dei nomi.
È possibile anche aggiungere più spazi dei nomi a quello dell'Assemblea. Questo avviene automaticamente in Visual Studio quando si crea una nuova cartella.
È SingletonClass class non è pubblico, quindi non è visibile all'esterno del namespace assemblea .
Correzione : i commenti sono a destra, come dice MSDN :
Le classi e le strutture che non sono nidificati all'interno di altre classi o struct può essere sia pubblico o interna. Un tipo dichiarato come pubblico è accessibile da qualsiasi altro tipo. Un tipo dichiarato come interno è accessibile solo tipi all'interno dello stesso complesso . Le classi e le strutture sono dichiarate come interno di default a meno che non si aggiunge il pubblico parola chiave per la definizione della classe, come nell'esempio precedente. Le definizioni di classe o struct può aggiungere la parola chiave interna per rendere il loro livello di accesso esplicito. modificatori di accesso non influiscono sulla classe o struttura in sé -. ha sempre accesso a se stesso e tutti i suoi membri