2017-10-18 77 views
5

为什么VS抱怨这个终结器?CA1821删除空的终结器

VS 2017年 - 15.3.5
微软代码分析2017年 - 2.3.0.62003

using System; 

namespace ConsoleApp 
{ 
    class DisposableClass : IDisposable 
    { 
#if DEBUG 
     ~DisposableClass() // CA1821 Remove empty Finalizers 
     { 
      System.Diagnostics.Debug.Fail ("Forgot Dispose?"); 
     } 
#endif 

     public void Dispose() 
     { 
#if DEBUG 
      GC.SuppressFinalize (this); 
#endif 
     } 
    } 

    class Program 
    { 
     static void Main (string[] args) 
     { 
      Console.WriteLine ("Hello World!"); 
     } 
    } 
} 
+3

请张贴代码,而不是图片的代码。 –

+2

那么,这是否发生在调试或发布版本?或者两者都可能? – Evk

+1

@Evk:在两种情况下,当我更改为Release(未检查DEBUG常量)时,“if DEBUG”和“endif”之间的文本不会变灰。 – apocalypse

回答

7

这看起来是a bug in the Analyzer

从发行6月23日评论:

@nguerrera谢谢,你是正确的,该分析仪在报告发布构建一个有效的问题。但是,分析仪中仍然存在一个问题 - 如果封闭方法也被有条件地排除,它不应该触发。例如,以下版本仍会在发布和调试版本中触发诊断。

#if DEBUG 
    ~InvisibleEditor() 
    { 
     Debug.Assert(Environment.HasShutdownStarted, GetType().Name + " was leaked without Dispose being called."); 
    } 
#endif 
+0

我认为这是解决方案。但我们在这里有两个错误。其次,当我更改为发布模式时,文本在if ... endif之间变灰,但只在.NET框架项目中,而不在.NET核心项目中... – apocalypse

+0

我在我的机器上试过了。预处理器指令中的代码应该已变灰,但不是(VS bug?)。但是,当我构建两种配置并在ILDASM中打开它们时,可以看到从发布程序集中排除了Finalize()方法。 –

+2

如果您更改为释放,然后重新启动VS,它将变灰。如果你想改回Debug,你也需要重新启动VS.但它只是视觉效果。 – apocalypse