CA1821删除空的终结器
为什么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!");
}
}
}
这看起来是a bug in the Analyzer。
从发行6月23日评论:
@nguerrera谢谢,你是正确的,该分析仪在报告发布构建一个有效的问题。但是,分析仪中仍然存在一个问题 - 如果封闭方法也被有条件地排除,它不应该触发。例如,以下版本仍会在发布和调试版本中触发诊断。
#if DEBUG ~InvisibleEditor() { Debug.Assert(Environment.HasShutdownStarted, GetType().Name + " was leaked without Dispose being called."); } #endif
我认为这是解决方案。但我们在这里有两个错误。其次,当我更改为发布模式时,文本在if ... endif之间变灰,但只在.NET框架项目中,而不在.NET核心项目中... – apocalypse
我在我的机器上试过了。预处理器指令中的代码应该已变灰,但不是(VS bug?)。但是,当我构建两种配置并在ILDASM中打开它们时,可以看到从发布程序集中排除了Finalize()方法。 –
如果您更改为释放,然后重新启动VS,它将变灰。如果你想改回Debug,你也需要重新启动VS.但它只是视觉效果。 – apocalypse
请张贴代码,而不是图片的代码。 –
那么,这是否发生在调试或发布版本?或者两者都可能? – Evk
@Evk:在两种情况下,当我更改为Release(未检查DEBUG常量)时,“if DEBUG”和“endif”之间的文本不会变灰。 – apocalypse