Singleton в C# «недоступно», когда не в одном именном пространстве?

StackOverflow https://stackoverflow.com/questions/4802880

Вопрос

Я попытался внедрить класс Синглтона следующим образом (я использую VS2008 SP1):

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

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

Когда я хочу получить доступ к нему из класса в другом пространстве имен (кажется, что это проблема, в том же пространстве имен, что и работает), как:

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

Я получаю ошибку компилятора:

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

У кого -то есть идея, как это решить?

Спасибо заранее!

Это было полезно?

Решение

Ты упускаешь ключевое слово public из вашего класса определения.

Другие советы

Звучит больше похоже на Синглтон в другой сборке. Модификатор по умолчанию для класса является внутренним и, таким образом, доступен только в сборке.

Singletonclass имеет внутреннюю видимость, поэтому, если эти два пространства имен находятся в разных сборках, весь класс в недоступном.

Изменять

class SingletonClass

к

public class SingletonClass

сдача

class SingletonClass

к

public class SingletonClass

Чтобы отметить это публичным, таким образом доступным

или даже лучше:

public sealed class SingletonClass

Поскольку участники статичны:

больше здесь

Ты класс SingletonClass видно в других пространствах имен. Но это не видно в других собраниях/проектах.

Ваш класс личный. Это означает, что весь код в вашем текущем проекте (= Assembly = .dll) может увидеть этот класс. Класс, однако, скрыт для кода в других проектах.

Существует слабая корреляция между пространством имен и сборкой. Одно пространство имен может существовать в нескольких сборках, например, mscorlib.dll и System.dll, оба содержат пространство имен системы.

Но обычно, когда вы создаете новый проект в Visual Studio, вы получаете новое пространство имен.

Вы также можете добавить несколько пространств имен в одну сборку. Это происходит автоматически в Visual Studio, когда вы создаете новую папку.

Вы, синглтон, учебный класс не публично, поэтому не видно за пределами Пространство имен сборка.

Коррекция: Комментарии верны, как говорит MSDN:

Классы и структуры, которые не вложены в другие классы или структуры, могут быть публичными или внутренними. Тип, объявленный общественным, доступен любым другим типом. Тип, объявленный внутренним, доступен только типами в одной и той же сборке. Анкет Классы и структуры по умолчанию объявляются как внутренние по умолчанию, если ключевое слово не добавлено в определение класса, как в предыдущем примере. Определения класса или структуры могут добавить внутреннее ключевое слово, чтобы сделать их уровень доступа явным. Модификаторы доступа не влияют на сам класс или структуру - он всегда имеет доступ к себе и всем своим членам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top