2017-10-18 80 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