Question

J'ai essayé de mettre en œuvre une classe singleton de la manière suivante (j'utilise VS2008 SP1):

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

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

Quand je veux y accéder à partir d'une classe dans un autre espace de noms (il semble que ce soit le problème, dans le même espace, il fonctionne) comme:

namespace secondNamespace
{
   ...
   firstNamespace.SingletonClass inst = firstNamespace.SingletonClass.Instance;
   ...
}

J'obtiens une erreur du compilateur:

error CS0122: 'firstNamespace.SingletonClass' is inaccessible due to its protection level

Est-ce que quelqu'un a une idée de comment résoudre ce problème?

Un grand merci à l'avance!

Était-ce utile?

La solution

Vous êtes absent le public mot clé de votre définition de classe.

Autres conseils

Ressemble plus le singleton est dans un assemblage. Le modificateur par défaut d'une classe est interne et donc accessible que dans l'assemblage.

Le SingletonClass dispose d'une visibilité interne, donc si les deux espaces de noms sont dans différentes assemblées, toute la classe inaccessible.

Modifier

class SingletonClass

à

public class SingletonClass

changement

class SingletonClass

à

public class SingletonClass

pour marquer publique, donc accessible

ou mieux encore:

public sealed class SingletonClass

puisque les membres sont statiques:

plus

classe SingletonClass est visible dans d'autres espaces de noms. Mais ce n'est pas visible dans d'autres assemblées / projets.

Votre classe est privée. Cela signifie que tous le code dans votre projet en cours (= Assemblée = .dll) peuvent voir cette classe. La classe est cependant caché pour le code dans d'autres projets.

Il existe une corrélation faible entre l'espace de noms et l'assemblage. Un espace de noms peut exister dans plusieurs ensembles, par exemple mscorlib.dll et System.dll contiennent tous deux l'espace de noms System.

Mais normalement, lorsque vous créez un nouveau projet dans Visual Studio, vous obtenez un nouvel espace de noms.

Vous pouvez également ajouter plusieurs espaces de noms à celui de l'Assemblée. Ceci se produit automatiquement dans Visual Studio lorsque vous créez un nouveau dossier.

Vous SingletonClass class est pas publique, donc n'est pas visible en dehors de la namespace Assemblée .

Correction : les commentaires sont justes, comme le dit msdn :

Classes et structures qui ne sont pas imbriqués dans d'autres classes ou struct peut être public ou interne. Un type déclaré comme public est accessible par tout autre type. Un type déclaré comme interne est uniquement accessible par types au sein du même ensemble . Les classes et structs sont déclarées comme internes par défaut à moins que le mot-clé publique est ajoutée à la définition de la classe, comme dans l'exemple précédent. Les définitions de classe ou struct pouvez ajouter le mot-clé interne pour rendre leur niveau d'accès explicite. Les modificateurs d'accès n'affectent pas la classe ou se struct -. il a toujours accès à lui-même et tous ses membres

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top