クラスが常に安全に廃棄されるように、usingステートメントの使用を強制するある種の属性を使用して自分のクラスを修飾することが本当に好きでしょうかメモリリークを避けることができます。誰もそのような技術を知っていますか?C#でusingステートメントを使用することは可能ですか?
答えて
あなたが並べ替えることのできる方法が1つあります。デリゲートをとる静的メソッドを使用してオブジェクトにアクセスできるようにする方法があります。非常に簡単な例としては(当然のようにファイルを開いて多くの異なる方法がある - などの読み取り/書き込み):
public static void WorkWithFile(string filename, Action<FileStream> action)
{
using (FileStream stream = File.OpenRead(filename))
{
action(stream);
}
}
あなたの使い捨てのオブジェクトのインスタンスを作成することができる唯一の事はあなた自身の内のメソッドである場合あなたが適切に使用されるようにすることができます。確かに、代議員が参照のコピーを取って後でそれを使用しようとするのを止めることは何もないが、それは全く同じ問題ではない。
この手法では、オブジェクトでできることが厳しく制限されますが、場合によっては有用かもしれません。
私はこれに似た何かをやって少し汚いと感じました。*今はSkeetの支持を得ています* –
これはどんな意味でも「新しい」パターンではありません。 –
FxCopを使用してこのルールを適用できます。ウィキペディアのquick overviewを参照してください。
人がクラスを使用しているときには役に立ちません.FxCopを使用するようにユーザーに指示することはできません – ChrisF
良い点。しかし、これは彼らの問題です:D –
ビルドの一部にして、それに注意を払わなければなりません。 –
オブジェクトが常に廃棄されるようにするには、IDisposableと組み合わせてファイナライザを使用します。
あなたが行う前に、IDisposableとfinalizersを読んで、あなたのクラスが管理されていないリソースの寿命を管理するようなことをしない限り、通常は必要ないということを意識してください。
ファイナライザを使用すると、オブジェクトは「使用済み」で囲まれているかどうかにかかわらず「最終的に」回収されます。 IDisposableの便利なusingステートメントは、確定的なクリーンアップを実行できるようにします。唯一の注意点は、ファイナライザが付いたオブジェクトがクリーンアップするのがより高価で、一般的にはファイナライズを待っている間にメモリ内に長く張り付いていることです。
REF When do I need to implement a finalizer or IDisposable? またはtechnorabble: Using Dispose, Finalizers and IDisposable
- 1. C++でアプレットを使用することは可能ですか
- 2. Eigenをcで使用することは可能ですか?
- 3. cでシリアルポートクラスを使用することは可能ですか?
- 4. シェフのif文でsupportsステートメントを使用することは可能ですか?
- 5. usingステートメント(C#)でさまざまな型を使用する
- 6. C#ビジュアルスタジオでイミディエイトウィンドウを使用してステートメントをテストすることは可能ですか?
- 7. PHPのC++バイナリを使用することは可能です
- 8. ORステートメントをjQueryに入れることは可能ですか
- 9. は、win32アプリケーションでactiveXコントロールを使用することは可能ですか?ことは可能であるが、
- 10. RHV(右辺値)でusingステートメントを使用できますか?
- 11. Application.Run(new Form())をusing(...){}ステートメントでラップすることは安全ですか?
- 12. ライブラリでThreadPoolを使用することは可能ですか?
- 13. スプリングブートでマイクロサービスを使用することは可能ですか
- 14. vimをマウスで使用することは可能ですか
- 15. レポートでカスタムフィールドを使用することは可能ですか
- 16. iOSでTTSを使用することは可能ですか
- 17. xulでjqueryを使用することは可能ですか?
- 18. UIWebViewでiframeを使用することは可能ですか?
- 19. スクリプトコンポーネントでOleDbConnectionsを使用することは可能ですか?
- 20. CTestでOpencoverを使用することは可能ですか?
- 21. BackJone.jsでExtJSを使用することは可能ですか?
- 22. CallerMemberNameAttributeをfで使用することは可能ですか?
- 23. ORをSelenium.Clickで使用することは可能ですか?
- 24. クラスレベル変数でusingステートメントを使用することは悪い習慣ですか?
- 25. EF(エンティティフレームワーク) "using"ステートメントの使用
- 26. オブジェクト指向プログラミングにCUDA Cを使用することは可能ですか?
- 27. C++クラスの宣言を2つ使用することは可能ですか?
- 28. usingステートメント内でTask.Runを呼び出すことはできますか?
- 29. CMYKカラーピッカーを使用することは可能ですか?
- 30. Out ParameterExpressionを使用することは可能ですか?
何異なる使い捨てのオブジェクトに、オブジェクトを埋め込むことは? –
IDisposableでクラスをデコレートすることは、クラスのコンシューマが、UsingでラップするかDisposeを呼び出すかのフラグになります。 「使用する」テクニックを適用すると、効果的にあなたの良心的な消費者に「あなたはあまりにも厚くてDisposeを呼び出すことができないと思う」と言って、使用を制限します。 –
私はまた、誰かがあなたのオブジェクトをあるメソッドで作成し、それを別のメソッドに処分したいというシナリオがないと確信していますか? (おそらく彼らもIDisposableだ)。誰かがこれをすることは不可能になっています。 –