C#中的Finalize()方法中的override

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();
            }
        }

我收到如下错误信息:

Error 1 不要覆盖object.Finalize。相反,请提供析构函数。

顺便说一句,这是由第三方公司编译的原始代码。
如何解决这个问题?如何使用override进行Finalize操作?


问题到底是什么?代码似乎完全错误,因为它看起来像在终结器中关闭托管对象... - Alexei Levenkov
2个回答

5
正如该消息所述,您不应直接覆盖Finalize,而应提供一个析构函数。尽管如此,该代码还有另一个致命问题。
protected override void Finalize() {
  try { 
    ...
  } finally { 
    this.Finalize();
  }
}

这段代码最终会导致代码中的堆栈溢出。它在一个finally块中递归调用自身,因此只会循环直到堆栈空间用完。代码可能应该使用以下替代方法。
base.Finalize();

这将会链接到基类型上的Finalize实现。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接