Singleton в C# «недоступно», когда не в одном именном пространстве?
-
22-10-2019 - |
Вопрос
Я попытался внедрить класс Синглтона следующим образом (я использую 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:
Классы и структуры, которые не вложены в другие классы или структуры, могут быть публичными или внутренними. Тип, объявленный общественным, доступен любым другим типом. Тип, объявленный внутренним, доступен только типами в одной и той же сборке. Анкет Классы и структуры по умолчанию объявляются как внутренние по умолчанию, если ключевое слово не добавлено в определение класса, как в предыдущем примере. Определения класса или структуры могут добавить внутреннее ключевое слово, чтобы сделать их уровень доступа явным. Модификаторы доступа не влияют на сам класс или структуру - он всегда имеет доступ к себе и всем своим членам.