2013-08-14 18 views
3
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(); 
      } 
     } 

Я получаю это сообщение об ошибке:C# переопределение в Finalize()

Error 1 Do not override object.Finalize. Instead, provide a destructor.

, кстати, это Оригинальный код соблюдается компанией третьей стороны.
как решить эту проблему? как завершить с переопределением?

+0

Что именно проблема? Код кажется совершенно неправильным, поскольку он похож на закрытие управляемых объектов в финализаторе ... –

ответ

3

Если вы можете редактировать код, вы можете переместить код деструктора. Для формы под названием «Form1» деструктор будет выглядеть так:

~Form1() 
{ 
    this.FtcpSock.Close(); 
    this.FudpSock6800.Close(); 
    this.FudpSock6801.Close(); 
    this.FudpSock6802.Close(); 
    this.FudpSock6803.Close(); 
    this.FudpSock6804.Close(); 
    this.FudpSock6806.Close(); 
} 

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

5

Как указано в сообщении, вы не должны переопределять Finalize напрямую, а вместо этого предоставлять деструктор. Не обращая внимания, что хотя код имеет еще одну роковую проблему

protected override void Finalize() { 
    try { 
    ... 
    } finally { 
    this.Finalize(); 
    } 
} 

Этот код будет в конечном итоге приведет к переполнению стека в коде. Он рекурсивно вызывает себя в блоке finally и, следовательно, будет просто зацикливаться до тех пор, пока не закончится пространство стека. Код был, вероятно, имел в виду использовать следующую вместо

base.Finalize(); 

Это будет цепь реализации Finalize на базовом типе

 Смежные вопросы

  • Нет связанных вопросов^_^