Почему статические классы не могут иметь деструкторов?
-
05-07-2019 - |
Вопрос
Две части этого:
Если статический класс может иметь статический конструктор, почему у него не может быть статического деструктора?
Каков наилучший способ решения проблемы?У меня есть статический класс, который управляет пулом подключений, являющихся 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, поэтому я закончу свое решение здесь.)
Статический класс никогда не уничтожается. Это прекращается вместе с программой. Вы можете использовать шаблон синглтона в качестве реализации вместо использования статического класса