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!

È stato utile?

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:

più qui

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top