Вопрос по c# – Лучший способ предотвратить создание класса?

14

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

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

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

почему бы не абстрагироваться Trikaldarshi
& quot; Запрещено создание экземпляра & quot; точное определениеstatic class, Зачем тебе что-то еще? Henk Holterman

Ваш Ответ

5   ответов
3

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

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

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

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

@asawyer, я забыл об этом (я использовал Activator.CreateInstance & lt; & gt;)
Я пытался использовать Activator.CreateInstance с закрытым конструктором, и это вызвало исключение
Я забыл об отражении, хорошая мысль.
@AdrianIftode Проверьте, что ваши привязки привлекают частных пользователей.
Ошибка:an abstract class cannot be sealed or static, Вы имели в виду & quot;sealed, abstract или жеstatic& Quot ;?
7

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

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

Нет, аннотация имеет другое назначение. Сделай это статичным.
Я сделал это, но он не работает, но я могу создать объект. Romesh Somani
@HenkHolterman Вы правы, конечно.
@RomeshSomani Это зависит от того, откуда вы пытаетесь создать экземпляр. Это нужно полностью отрицать, сделать абстрактным. редактировать - Извините, я имел в виду статические.
благодаря своей работе Romesh Somani
15

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

Это все еще может быть реализовано с помощью отражения. И если он не запечатан, вы можете просто извлечь из него и затем использовать защищенный конструктор, к которому у вас теперь есть доступ.
@ Джейсон Это хорошие моменты!
2

How can you make your class not be instanced without having your class be static or abstract?

Тогда ответ на этот вопрос заключается в реализациисинглтон, что в .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
    }
}

Шаблон синглтона позволяет вам передавать ваш класс как ссылку на методы, в то же время гарантируя, что у вас есть только один экземпляр вашего класса. Это также делает тестирование намного проще, так как вы можете иметьImyClass экземпляр которогоmyClass реализует, это очень полезно при создании фиктивных объектов.

Без .NET4 вы все еще можете реализовать шаблон синглтона, например:

private static readonly myClass instance = new myClass();

public static Instance
{
    get
    {
        return instance;
    }
}

// rest of code remains the same

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

Таким образом, вопрос, вероятно, задает вопрос: знаете ли вы шаблон синглтона и понимаете ли вы его важность по сравнению со статическими классами для модульных тестов и макетов объектов.

Как уже отмечали другие,static поля, даже те, отмеченныеreadonly может быть установлен с отражением, в дополнениеprivate Конструктор можно вызвать с помощью отражения. Если вам нужно это предотвратить, либо вам нужно, чтобы вызывающий код выполнялся в менее надежном пространстве домена приложения, либо вам нужно будет реализовать свой класс какstatic.

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

19

absolutely не хочу никаких экземпляров. Это останавливаетсяanyone от создания экземпляров. Класс будет запечатанand абстрактно, и не будет иметьany Конструкторы.

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

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

УвидетьMSDN для получения дополнительной информации о статических классах.

Любопытная вещь о статических классах, они неlook like classes at all; они больше похожи на модули ...

Похожие вопросы