C# のさまざまな種類の参照の主な利点を誰かが説明できますか?
- 弱参照
- ソフト参照
- ファントム参照
- 強力な参照。
多くのメモリを消費しているアプリケーションがあり、これが注目すべき領域かどうかを判断しようとしています。
C# のさまざまな種類の参照の主な利点を誰かが説明できますか?
多くのメモリを消費しているアプリケーションがあり、これが注目すべき領域かどうかを判断しようとしています。
ソフト参照とファントム参照は Java から来ていると思います。長い弱参照 (C# の WeakReference コンストラクターに true を渡す) は、Java の PhantomReference に似ていると見なされる場合があります。C# で SoftReference に類似するものがある場合、それが何であるかはわかりません。
弱参照はオブジェクトの寿命を延ばさないため、すべての強参照が範囲外になるとガベージ コレクションが可能になります。これらは、初期化にコストがかかる大きなオブジェクトを保持するのに役立ちますが、アクティブに使用されていない場合はガベージ コレクションに使用できるはずです。
これがアプリケーションのメモリ消費の削減に役立つかどうかは、アプリケーションの仕様に完全に依存します。たとえば、将来再利用される可能性があるかどうかに関係なく、適度な数のキャッシュされたオブジェクトがぶら下がっている場合、弱参照はキャッシュのメモリ消費を改善するのに役立ちます。ただし、アプリが非常に多数の小さなオブジェクトを操作している場合、弱い参照は問題を悪化させます。これは、参照オブジェクトがそれと同じかそれ以上のメモリを占有するためです。
MSDN には、弱い参照に関する適切な説明があります。重要な引用は、それが言うところの一番下にあります:
メモリ 管理の問題に対する自動的な解決策として弱い参照を使用することは避けてください。代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュ ポリシーを作成してください。
WeakReference を実際に目にするたびに、メモリ管理の問題に対する自動解決策として使用されてきました。アプリケーションの問題に対するより良い解決策がある可能性があります。
WeakReference を使用した見事な実際の例は、Android 開発チュートリアルで説明されています。
ビュー (ImageView) にはイメージ (Bitmap) とイメージ コンテナーがあります。イメージがメモリからではなく (ディスクやネットなどから) 読み込まれる場合、UI スレッドと画面がロックされる可能性があります。これを回避するには、非同期タスクを使用できます。
問題は、非同期タスクが終了したときに発生します。その時点では、イメージ コンテナーはまったく役に立ちません (画面が変更されるか、Android がスクロール後に非表示のビュー パーツをアンロードします)。ここで WeakReference が役立ち、ImageView がガベージ コレクションされます。
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
PS 例は Java ですが、C# 開発者は理解できます。
ソース: http://developersdev.blogspot.ru/2014/01/weakreference-example.html