3

別の CA2000 警告が表示されます。

次のコードは、CA2000 警告を生成します。

// Use an emulated GPS device
nmeaInterpreter.Start(new VirtualDevice(new NmeaEmulator()));

次の警告が発生します。

CA2000 : Microsoft.Reliability : In method 'GpsService.Start()', call System.IDisposable.Dispose on object 'new NmeaEmulator()' before all references to it are out of scope.

CA2000 に関する Microsoft のドキュメントを既に確認しましたが、ネストされたコンストラクターを処理する方法の良い例を見つけることができませんでした。明らかに、エミュレータへの参照を自分で保存したくありません。参照がコンストラクターにのみ渡されるようにします。

C# は、破棄する必要があるボンネットの下に一時オブジェクトを作成していますか?

4

1 に答える 1

4

C# は、破棄する必要があるボンネットの下に一時オブジェクトを作成していますか?

はい、オペレーターを使用するたびnewに、新しいオブジェクトが作成されます。一般に、ガベージ コレクターにこの種の処理を任せることができますが、CA2000 は、作成したオブジェクトがIDisposableインターフェイスを実装しているという事実を警告しているため、メソッドを呼び出して、Dispose使用するアンマネージ リソースが取得されるようにする必要があります。適当にリリース。

コンストラクターの呼び出しでこのようにオブジェクトをネストすることは、ドキュメンテーションで説明されているように、やや危険です。オブジェクトの 1 つの構築が失敗した場合、ネストされたオブジェクトが適切に破棄されたことを確認する方法がないためです。

そもそもなぜこのパターンを使用しているのかよくわかりません。クラスは、VirtualDevice作成したオブジェクトの有効期間を管理する責任を単独で負う必要があります。メソッドがしGpsService.Start()なければならないこと (または知っていること) は、VirtualDeviceオブジェクトを作成することだけです。次に、そのオブジェクトは、必要なネストされたオブジェクトを作成し、後で適切に破棄されるようにする必要があります。

于 2012-05-22T10:41:44.720 に答える