Pregunta

Traté de implementar una clase Singleton de la siguiente manera (uso VS2008 SP1):

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

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

Cuando quiero acceder a ella desde una clase en un espacio de nombres diferente (parece que este es el problema, en el mismo espacio de nombres funciona) como:

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

Recibo un error del compilador:

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

¿Alguien tiene una idea de cómo resolver esto?

¡Muchas gracias de antemano!

¿Fue útil?

Solución

Te estás perdiendo la palabra clave public de tu definición de clase.

Otros consejos

Suena más como si el singleton esté en una asamblea diferente. El modificador predeterminado para una clase es interno y, por lo tanto, solo accesible en el ensamblaje.

SingletOnClass tiene visibilidad interna, por lo que si los dos espacios de nombres están en diferentes ensamblajes, toda la clase inaccesible.

Cambio

class SingletonClass

a

public class SingletonClass

cambio

class SingletonClass

a

public class SingletonClass

para marcarlo público, así accesible

o mejor:

public sealed class SingletonClass

Dado que los miembros son estáticos:

más aquí

Tu clase SingletonClass es visible en otros espacios de nombres. Pero no es visible en otras asambleas/proyectos.

Tu clase es privada. Esto significa que todo el código en su proyecto actual (= ensamblaje = .dll) puede ver esta clase. Sin embargo, la clase está oculta para el código en otros proyectos.

Existe una correlación débil entre el espacio de nombres y el ensamblaje. Un espacio de nombres puede existir en múltiples ensamblajes, por ejemplo, mscorlib.dll y system.dll contienen el espacio de nombres del sistema.

Pero normalmente, cuando creas un nuevo proyecto en Visual Studio, obtienes un nuevo espacio de nombres.

También puede agregar múltiples espacios de nombres al único ensamblaje. Esto sucede automáticamente en Visual Studio cuando crea una nueva carpeta.

Tu singletonclass clase no es público, por lo que no es visible fuera del espacio de nombres asamblea.

Corrección: Los comentarios son correctos, como se dice MSDN:

Las clases y estructuras que no están anidadas en otras clases o estructuras pueden ser públicas o internas. Un tipo declarado como público es accesible por cualquier otro tipo. Un tipo declarado como interno solo es accesible por tipos dentro del mismo ensamblaje. Las clases y las estructuras se declaran como internas de forma predeterminada a menos que la palabra clave pública se agregue a la definición de clase, como en el ejemplo anterior. Las definiciones de clase o estructura pueden agregar la palabra clave interna para que su nivel de acceso sea explícito. Los modificadores de acceso no afectan la clase o la estructura en sí: siempre tiene acceso a sí mismo y a todos sus propios miembros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top