2017-10-18 8 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定数)、 '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

私はそれが解決策だと思います。しかし、ここに2つのバグがあります。 2番目は、リリースモードに変更するとテキストは... endifの間でグレーアウトされますが、NETフレームワークプロジェクトではなくNETコアプロジェクトでのみ使用されます。 – apocalypse

+0

私は自分のマシンでそれを試しました。プリプロセッサディレクティブ内のコードはグレイアウトされていたはずですが、そうではありませんでした(VS bug?)。しかし、両方の構成をビルドしてILDASMで開くと、Finalize()メソッドがリリースアセンブリから除外されていることがわかります。 –

+2

リリースに変更してからVSを再起動すると、グレーアウトされます。また、デバッグに戻す場合は、VSを再起動する必要があります。しかし、それは視覚効果に過ぎません。 – apocalypse