Почему статические классы не могут иметь деструкторов?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Две части этого:

  1. Если статический класс может иметь статический конструктор, почему у него не может быть статического деструктора?

  2. Каков наилучший способ решения проблемы?У меня есть статический класс, который управляет пулом подключений, являющихся COM-объектами, и мне нужно убедиться, что их подключения будут закрыты / разблокированы, если что-то взорвется в другом месте программы.

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

Решение

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

Например, если у вас сейчас есть:

static class MyClass
{
    public static void MyMethod() {...}
}

//Using the class:
MyClass.MyMethod();

вы бы вместо этого:

class MyClass : IDisposable
{
    public static MyClass()
    {
        Instance=new MyClass();
    }

    public static MyClass Instance {get; private set;}

    public void MyMethod() {...}

    public void Dispose()
    {
        //...
    }

    ~MyClass()
    {
        //Your destructor goes here
    }
}

//Using the class:
MyClass.Instance.MyMethod();

(обратите внимание, как экземпляр создается в статическом конструкторе, который вызывается при первом обращении к любому из статических членов класса)

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

<Ол>
  • Статические классы не имеют деструкторов, потому что статический класс никогда не уничтожается.

  • Если вы хотите создать и уничтожить несколько его экземпляров, он не должен быть статичным. Сделайте это полным классом.

  • В любом случае деструкторы не должны использоваться для этой цели. Используйте IDisposable / Dispose.

  • 1.Почему?-- Тип не может иметь конструктора как такового, как в том, как вы обычно представляете конструкторы в экземплярах.В общем, его иногда называют методом "статического инициализатора", но Microsoft использует терминологию "конструктор типов" (и у него есть особые ограничения) - вы помещаете в него код для инициализации типа / класса - если бы это был конструктор экземпляра, он мог бы быть перегружен.Это статическое ограничение на "конструктор типов" связано с тем, что .NET CLR отвечает за загрузку шаблона класса в кучу и не позволяет указывать параметры при таких обстоятельствах (потому что как бы вы вообще передавали аргументы).Поскольку в самом строгом смысле программист не несет ответственности за вызов конструктора типа, не имело бы особого смысла разрешать программисту кодировать статический деструктор, когда он больше относится к предметной области CLR.Среда CLR в конечном итоге удалит шаблон класса из кучи, но срок службы шаблона класса больше, чем у его экземпляров, поэтому вы все равно не захотите делать в нем что-либо ресурсоемкое (напримерудерживайте открытым подключение к базе данных).

    2.Что?- Синглтон Если вы столкнулись с ситуацией, когда вы чувствуете, что вам нужно открыть ресурс в шаблоне класса и впоследствии уничтожить его, вы могли бы рассмотреть Шаблон одноэлементного программного обеспечения иметь только один экземпляр этого класса и, возможно, также реализовать Система.IDiposable интерфейс для помощи в очистке, в дополнение к деструктору.(Я вижу, что кто-то уже опередил меня с примером кода IDisposable, поэтому я закончу свое решение здесь.)

    Статический класс никогда не уничтожается. Это прекращается вместе с программой. Вы можете использовать шаблон синглтона в качестве реализации вместо использования статического класса

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