5

ho cercato di implementare una classe Singleton nel modo seguente (io uso VS2008 SP1):Singleton in C# "inaccessibile" quando non si trova nello stesso spazio dei nomi?

namespace firstNamespace 
{ 
    class SingletonClass 
    { 
     private SingletonClass() {} 

     public static readonly SingletonClass Instance = new SingletonClass(); 
    } 
} 

Quando voglio accedervi da una classe in uno spazio dei nomi diverso (sembra che questo è il problema, in lo 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 problema?

Molte grazie in anticipo!

+0

molte grazie a tutti per le vostre risposte rapide e utili! –

risposta

10

Ti manca la parola chiave public dalla definizione della classe.

-1

È SingletonClass classe non è pubblico, quindi non è visibile all'esterno del namespace assemblaggio.

Correzione: i commenti sono a destra, come dice msdn:

Classes and structs that are not nested within other classes or structs can be either public or internal. A type declared as public is accessible by any other type. A type declared as internal is only accessible by types within the same assembly. Classes and structs are declared as internal by default unless the keyword public is added to the class definition, as in the previous example. Class or struct definitions can add the internal keyword to make their access level explicit. Access modifiers do not affect the class or struct itself — it always has access to itself and all of its own members.

+1

Lo spazio dei nomi non è rilevante per la visibilità interna, l'assembly in cui è dichiarata la classe è. –

+0

È visibile al di fuori del namespace. –

2

Il SingletonClass ha visibilità interna, quindi se i due spazi dei nomi sono in diverse assemblee, l'intera classe in inaccessibile.

Change

class SingletonClass 

a

public class SingletonClass 
3

suona più come il Singleton è in un assembly diverso. Il modificatore predefinito per una classe è interno e quindi accessibile solo nell'assembly.

2

cambiamento

class SingletonClass 

a

public class SingletonClass 

a marcarlo pubblico, quindi accessibile

o meglio ancora:

public sealed class SingletonClass 

poiché i membri sono statici:

more here

1

Si classe SingletonClass è visibile in altri spazi dei nomi. Ma non è visibile in altre Assemblee/Progetti.

La tua classe è privata. Questo significa che tutto il codice nel tuo progetto corrente (= Assembly = .dll) può vedere questa classe. La classe è tuttavia nascosta per il codice in altri progetti.

C'è una debole correlazione tra lo spazio dei nomi e l'assieme. Uno spazio dei nomi può esistere in più assembly, ad esempio mscorlib.dll e System.dll contengono entrambi lo spazio dei nomi System.

Normalmente, quando si crea un nuovo progetto in Visual Studio, si ottiene un nuovo spazio dei nomi.

È inoltre possibile aggiungere più spazi dei nomi a un unico assieme. Ciò accade automaticamente in Visual Studio quando si crea una nuova cartella.

+0

grazie per il chiarimento - sono nuovo di questo. –