DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34058 / inTopicNo.1)  CA2213の警告が消えません
  
□投稿者/ CHIKO 一般人(1回)-(2018/12/08(Sat) 15:06:37)
  • アイコン環境/言語:[C#VS2017] 
    分類:[.NET] 

    いつも参考にさせていただいています、ありがとうございます。
    DLL参照やTimerのDisposeで困っています、宜しくお願い致します。

    Consoleアプリケーションを作成しています。
    System.Timers.Timerを2つ使用しています。
    コード分析するとwarning CA2213: Microsoft.Usage : 'XXX' は、IDisposable 型 'Timer' であるフィールド 'XXX.Timer' を含んでいます。このフィールドで Dispose または Close を呼び出すには、'XXX' の Dispose メソッドを変更してください。
    がでます。

    以下のコードを記述しておりますが、警告が消えません。何が問題なのでしょうか。
    #region IDisposable Support
    private bool disposedValue = false; // 重複する呼び出しを検出するには

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "TimerStopX")]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "TimerError")]
    protected virtual void Dispose(bool disposing)
    {
    if (!disposedValue)
    {
    if (disposing)
    {
    if (TimerError != null) { TimerError.Elapsed -= TimerError_Elapsed; }
    if (TimerStopX != null)
    {
    TimerStopX.Elapsed -= OnTime_Stop;
    }
    ((IDisposable)TimerStopXy)?.Dispose();
    ((IDisposable)TimerError)?.Dispose();
    }
    // TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下のファイナライザーをオーバーライドします。
    // TODO: 大きなフィールドを null に設定します。

    disposedValue = true;
    }
    }

    // TODO: 上の Dispose(bool disposing) にアンマネージド リソースを解放するコードが含まれる場合にのみ、ファイナライザーをオーバーライドします。
    // ~HTTPSockets() {
    // // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
    // Dispose(false);
    // }

    // このコードは、破棄可能なパターンを正しく実装できるように追加されました。
    public void Dispose()
    {
    // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
    Dispose(true);
    // TODO: 上のファイナライザーがオーバーライドされる場合は、次の行のコメントを解除してください。
    // GC.SuppressFinalize(this);
    }
    #endregion

    }
引用返信 削除キー/
■34059 / inTopicNo.2)  Re[1]: CA2213の警告が消えません
□投稿者/ 魔界の仮面弁士 大御所(1178回)-(2018/12/10(Mon) 09:18:16)
  • アイコンNo34058に返信(CHIKOさんの記事)
    > System.Timers.Timerを2つ使用しています。

    3 つあるようにも見えます。
    > TimerStopX.Elapsed -= OnTime_Stop;
    > ((IDisposable)TimerStopXy)?.Dispose();
    > ((IDisposable)TimerError)?.Dispose();



    > コード分析するとwarning CA2213: Microsoft.Usage : 'XXX' は、IDisposable 型 'Timer' であるフィールド 'XXX.Timer' を含んでいます。
    > このフィールドで Dispose または Close を呼び出すには、'XXX' の Dispose メソッドを変更してください。
    > がでます。

    この XXX というのは、「class HTTPSockets : System.IDisposable」のようなものでしょうか。
    だとしたら、「class HTTPSockets : System.ComponentModel.Component」に変更してみるとか。
    https://social.msdn.microsoft.com/Forums/ja-JP/b0430ffa-3e5e-40ae-9d79-ffb8283818f7/
引用返信 削除キー/
■34061 / inTopicNo.3)  Re[1]: CA2213の警告が消えません
□投稿者/ 魔界の仮面弁士 大御所(1180回)-(2018/12/10(Mon) 11:07:32)
  • アイコンNo34058に返信(CHIKOさんの記事)
    > 以下のコードを記述しておりますが、警告が消えません。

    試しに、TimerError を Private Field ではなく、
    Read-Only Property にしてみたところ、先の CA2213 警告が
    直接アクセス不能なバッキングフィールドを提示してきました。(^_^;)


     警告 CA2213 '型' は、IDisposable 型 'Timer' である
     フィールド '型.<TimerError>k__BackingField' を含んでいます。
     このフィールドで Dispose または Close を呼び出すには、
     '型' の Dispose メソッドを変更してください。


    ただし、setter が private で、getter が 非 private なプロパティにすると
    この警告は発生しませんでした。



    > ((IDisposable)TimerStopXy)?.Dispose();
    > ((IDisposable)TimerError)?.Dispose();

    「?.」がマズイみたいですね。
    VS2017 の場合、null 条件演算子 を使わなければ警告は出ませんでした。

    アナライザー側の問題のような気もするのですが、コード分析は
    既に非推奨な機能のようです。
    (VS2019 Preview 1 では、FxCop Analyzers に移行するよう促されます)



    いずれにせよ今回の場合、事前に null チェックを行っていますので、
    null 条件演算子を使う必要は無さそうです。

    if (!disposedValue)
    {
     if (disposing)
     {
      if (TimerError != null)
      {
       TimerError.Elapsed -= TimerError_Elapsed;
       TimerError.Dispose(); // TimerError?.Dispose();
       TimerError = null;
      }
      // 略
      //
      disposing = true;
     }
    }
引用返信 削除キー/
■34062 / inTopicNo.4)  Re[2]: CA2213の警告が消えません
□投稿者/ CHIKO 一般人(2回)-(2018/12/10(Mon) 11:23:52)
  • アイコンわざわざコーディングして調べて頂いてありがとうございます。

    ?を外したら警告が消えました!!(誤字の多いコードで大変失礼致しました)
    大変助かりました。

    >アナライザー側の問題のような気もするのですが、コード分析は
    >既に非推奨な機能のようです。
    >(VS2019 Preview 1 では、FxCop Analyzers に移行するよう促されます)

    情報ありがとうございます。VS2019がもうでているのですね。
    今後とも宜しくお願い致します。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -