1

私はそれが標準的な慣行ではないことを知っていますが、以下を行うことの欠点またはより良い代替案はありますか?コードが適切に使用されていることを確認したいだけですが、.NETはそれを保証するために何もしません。

public class MyClass : IDisposable
        public void Dispose()
        {
            // Some managed shutdown logic...
            GC.SuppressFinalize(this);
        }

#if DEBUG
        // Why is ConditionalAttribute not allowed if you can still achieve this with compiler directives?
        // [Conditional("DEBUG")]
        ~SFtpClient()
        {
            Debug.Fail("This class is IDisposable and should be wrapped by using {}");
        }
#endif
}
4

2 に答える 2

3

FxCopを使用して、CA2000を監視します。スコープを失う前にオブジェクトを破棄します。

于 2011-06-09T22:31:34.050 に答える
2

その条件は、RELEASEビルドの空のファイナライザーの不必要なファイナライズコストを防ぐので、私には良さそうです。GC.SupressFinalizeの周りにも#ifDEBUGを追加することをお勧めします。

[Conditional( "DEBUG")]は、メソッドを呼び出さないようにコンパイラーに指示しますが、メソッドはまだ存在しています。とにかく、Finalize()メソッドの呼び出しをコンパイルすることはできません。GCファイナライザーは属性をチェックしません。

于 2011-06-09T22:28:36.117 に答える