Мне нужно знать, как предотвратить создание экземпляра класса в .net?
Я знаю несколько методов, таких как создание класса Abstract и Static.
Есть ли еще способ сделать это?
Мне нужно знать, как предотвратить создание экземпляра класса в .net?
Я знаю несколько методов, таких как создание класса Abstract и Static.
Есть ли еще способ сделать это?
Создание статического класса - лучший подход, если вы абсолютно не хотите каких-либо экземпляров. Это не позволяет кому-либо создавать экземпляры. Класс будет как запечатанным, так и абстрактным, и не будет иметь никаких конструкторов.
Кроме того, язык заметит, что это статический класс и не позволяет использовать его в разных местах, которые подразумевают экземпляры, например. аргументы и переменные типа. Это указывает на намерение более четко, чем просто на создание частного конструктора, что может означать, что в этом классе есть экземпляры (например, для одноэлементной реализации).
О, и включение класса static остановит вас от введения каких-либо бессмысленных членов экземпляра в классе:)
Подробнее о статических классах см. MSDN.
Отметьте конструктор private
, protected
или, если он используется в другой сборке, internal
Маркировка конструктора private
. Конечно, это не мешает классу создавать экземпляр с помощью метода static
, например...
Более практично, какая цель запрещения создания экземпляра класса. Если он имеет синглтон, то подходит конструктор private
. Если это принудительное подклассирование, лучше сделать класс abstract
; если у него есть класс с утилитами, что делает его static
одним способом (тогда у вас могут быть только методы static
).
Мне нужно знать, как предотвратить создание экземпляра класса в .net?
Ваш вопрос непонятен.
Вы подразумеваете создание экземпляра во время выполнения? Сделайте класс abstract
или static
.
Вы имеете в виду, что конструктор недоступен в коде? Создайте конструктор private
. Но обратите внимание, что кто-то еще может использовать отражение, чтобы захватить дескриптор конструктора и создать экземпляр экземпляра во время выполнения.
Итак, что вы имеете в виду?
Если вопрос:
Как вы можете сделать свой класс не инстансом без вашего класса be
static
илиabstract
?
Тогда ответ на этот вопрос заключается в реализации singleton pattern, который в .NET 4+ легко выполняется с помощью
public sealed class myClass
{
private static readonly Lazy<myClass> lazyInstance =
new Lazy<myClass>(() => new myClass());
public static Instance
{
get
{
return lazyInstance.Value;
}
}
private myClass()
{
// constructor logic here
}
}
Шаблон singleton позволяет вам передавать свой класс в качестве ссылки на методы, сохраняя при этом, что у вас есть только один экземпляр вашего класса. Это также упрощает тестирование, так как вы можете использовать экземпляр ImyClass
, который реализует myClass
, это очень полезно при создании макетных объектов.
Без .NET4 вы все равно можете реализовать шаблон singleton, например:
private static readonly myClass instance = new myClass();
public static Instance
{
get
{
return instance;
}
}
// rest of code remains the same
Которая не имеет отложенной загрузки до ее вызова, есть много других способов (я думаю, о 6 разных способах), но два из них являются наиболее распространенными.
В общем, вопрос, скорее всего, спросит, знаете ли вы шаблон singleton и узнаете ли его значение для статических классов для модульных тестов и макетных объектов.
Как уже указывали другие, поля static
, даже те, что помечены readonly
, могут быть установлены с отражением, кроме того, конструктор private
можно вызвать с помощью отражения. Если вам нужно предотвратить это, вам нужно сделать код вызова запущенным в менее надежном пространстве приложения, или вам нужно будет реализовать свой класс как static
.
В общем, люди не заботятся о таких уровнях рефлексии, чтобы обойти свои ограничения, если они "действительно не нужны", например, написание нечетких/экстремальных тестов на случайный случай.