Finalize()中的C#覆盖

时间:2013-08-14 06:26:39

标签: c# override 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 个答案:

答案 0 :(得分:5)

如消息所述,您不应直接覆盖Finalize,而应提供析构函数。忽略这一点虽然代码还有一个致命的问题

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

此代码最终会导致代码中的堆栈溢出。它在finally块中以递归方式调用自身,因此只会循环直到用完堆栈空间。代码可能意味着使用以下代码

base.Finalize();

这将链接到基类型

Finalize的实现

答案 1 :(得分: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