Переопределение 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();
}

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

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

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

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

base.Finalize();

Это приведет к реализации Finalize на базовый тип

Другие вопросы по тегам