DOBON.NETプログラミング道掲示板
(現在 過去ログ3 を表示中)
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
[
最新記事及び返信フォームをトピックトップへ
]
[ トピック内全4記事(1-4 表示) ] <<
0
>>
■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/
HOME
HELP
新規作成
新着記事
トピック表示
発言ランク
ファイル一覧
検索
過去ログ
-
Child Tree
-