この例を見てみましょう。これで私のすべての質問がカバーされると思います。
class SomeClass
{
static SomeType PropertyA
{
get
{
if (....)
return MethodA();
else
return MethodB();
}
}
static SomeType MethodA() { ... }
static SomeType MethodB() { ... }
}
SomeClass.PropertyA プロパティを呼び出すとメモリ リークが発生しますか? プロパティ自体にはバッキングフィールドがなく、メモリリークが発生するため、私の意見はノーです。静的プロパティがメモリリークを引き起こす可能性があることを読んだので、これを尋ねますが、インスタンスへの参照を保持しているため、メモリリークの原因はバッキングフィールドだと思います。
したがって、上記の例では、上記の例の MethodA、MethodB、および PropertyA によってメモリ リークが発生することはありません。私はこれについて間違っていますか?
私が持っている別の質問は次のとおりです。ほとんどの場合、状態もデータも持たないクラスがたくさんあります。彼らは単に代理として行動しています。これらのメソッドのいくつかは、非常に頻繁に呼び出されます。私の質問は、これらのクラスをシングルトン、静的、または通常のクラスにする必要がありますか?
完璧な例は、5 ~ 10 個のメソッドを含み、いくつかの SQL クエリを実行するクラスです。
1)それらを通常どおりに持っている場合、(ユーザーの反応で)非常に頻繁にそれらを作成し、何らかのメソッドを呼び出してから、ガベージコレクションを許可する必要があります。
2)シングルトンと静的のどちらを選択するか、長所/短所は何ですか?
3) プロキシ メソッドを含むクラスがあり、それぞれに 10 個のパラメーターを含む 2 ~ 3 個の IDbCommands があり、それらを再利用することが有益である場合、正しいパターンを選択する際に何かが変わるでしょうか?
編集:おそらく誤解が原因で、私をさらに混乱させるいくつかの回答を得たので、最初の質問への回答を投稿します。PropertyA(およびMethodA)を介して取得される大きなバイト配列(300MB)を割り当てたテストを行いました。上記の例の PropertyA と MethodA はどちらも、このオブジェクトをフェッチした後は参照を保持しないため、コードの呼び出しが配列で完了するとすぐに、GC によって処理されます。そのため、ゲッターのみで静的プロパティを使用する場合、または静的メソッドを使用する場合、メモリ リークは発生しません。