【问题标题】:C# override in Finalize() [duplicate]Finalize() 中的 C# 覆盖 [重复]
【发布时间】:2013-08-15 23:39:50
【问题描述】:
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.

顺便说一下,这是由第三方公司编写的原始代码。
如何解决这个问题呢?如何通过覆盖完成?

【问题讨论】:

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

标签: c# overriding finalize


【解决方案1】:

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

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

这段代码最终会导致代码中的堆栈溢出。它在finally 块中递归地调用自己,因此只会循环直到您用完堆栈空间。该代码可能打算使用以下代码

base.Finalize();

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2012-02-16
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多