Почему статические классы не могут иметь деструкторы?
две части к этому:
Если статический класс может иметь статический конструктор, почему он не может иметь статический деструктор?
каков наилучший обходной путь? У меня есть статический класс, который управляет пулом соединений, которые являются COM-объектами, и мне нужно убедиться, что их соединения закрываются/освобождаются, если что-то взрывается в другом месте программы.
4 ответов
вместо статического класса вы должны использовать обычный класс с одноэлементным шаблоном (то есть вы сохраняете один экземпляр класса, на который, возможно, ссылается одно статическое свойство самого класса). Тогда вы можете иметь деструктор, или даже лучше, комбинацию деструктора и Dispose метод.
например, если у вас теперь есть:
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. Что? - Синглтон!--2--> Если вы столкнулись с обстоятельством, когда вам нужно открыть ресурс в шаблоне класса и уничтожить его после этого, вы можете рассмотреть шаблон программного обеспечения Singleton иметь только один экземпляр этого класса и, возможно, также использовать тег
статический класс, никогда не разрушается. Она завершается вместе с программой. Вы можете использовать шаблон singleton в качестве имплементации вместо использования статического класса