Лучший способ предотвратить создание экземпляра класса?

Мне нужно знать, как предотвратить создание экземпляра класса в .net?

Я знаю несколько методов, таких как создание класса Abstract и Static.

Есть ли еще способ сделать это?

Ответ 1

Создание статического класса - лучший подход, если вы абсолютно не хотите каких-либо экземпляров. Это не позволяет кому-либо создавать экземпляры. Класс будет как запечатанным, так и абстрактным, и не будет иметь никаких конструкторов.

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

О, и включение класса static остановит вас от введения каких-либо бессмысленных членов экземпляра в классе:)

Подробнее о статических классах см. MSDN.

Ответ 2

Отметьте конструктор private, protected или, если он используется в другой сборке, internal

Ответ 3

Маркировка конструктора private. Конечно, это не мешает классу создавать экземпляр с помощью метода static, например...

Более практично, какая цель запрещения создания экземпляра класса. Если он имеет синглтон, то подходит конструктор private. Если это принудительное подклассирование, лучше сделать класс abstract; если у него есть класс с утилитами, что делает его static одним способом (тогда у вас могут быть только методы static).

Ответ 4

Мне нужно знать, как предотвратить создание экземпляра класса в .net?

Ваш вопрос непонятен.

Вы подразумеваете создание экземпляра во время выполнения? Сделайте класс abstract или static.

Вы имеете в виду, что конструктор недоступен в коде? Создайте конструктор private. Но обратите внимание, что кто-то еще может использовать отражение, чтобы захватить дескриптор конструктора и создать экземпляр экземпляра во время выполнения.

Итак, что вы имеете в виду?

Ответ 5

Если вопрос:

Как вы можете сделать свой класс не инстансом без вашего класса 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.

В общем, люди не заботятся о таких уровнях рефлексии, чтобы обойти свои ограничения, если они "действительно не нужны", например, написание нечетких/экстремальных тестов на случайный случай.