Переопределение C# в Finalize()
protected override void Finalize()
{
try
{
this.FtcpSock.Close();
this.FudpSock6800.Close();
this.FudpSock6801.Close();
this.FudpSock6802.Close();
this.FudpSock6803.Close();
this.FudpSock6804.Close();
this.FudpSock6806.Close();
}
finally
{
this.Finalize();
}
}
Я получаю это сообщение об ошибке:
Error 1 Do not override object.Finalize. Instead, provide a destructor.
кстати, это оригинальный кодекс, соблюдаемый сторонней компанией.
Как решить эту проблему? как завершить с переопределением?
2 ответа
Если вы можете редактировать код, вы можете переместить код в деструктор. Для формы с именем "Form1" деструктор будет выглядеть так:
~Form1()
{
this.FtcpSock.Close();
this.FudpSock6800.Close();
this.FudpSock6801.Close();
this.FudpSock6802.Close();
this.FudpSock6803.Close();
this.FudpSock6804.Close();
this.FudpSock6806.Close();
}
Как говорится в сообщении, вы не должны переопределять Finalize
непосредственно, но вместо этого предоставить деструктор. Игнорирование этого, хотя у кода есть еще одна фатальная проблема
protected override void Finalize() {
try {
...
} finally {
this.Finalize();
}
}
Этот код в конечном итоге приведет к переполнению стека в коде. Он рекурсивно называет себя в finally
блок и, следовательно, будет просто цикл, пока вы не исчерпаете пространство стека Код, скорее всего, должен был использовать следующее
base.Finalize();
Это приведет к реализации Finalize
на базовый тип