誰かがC#のさまざまな種類の参照の主な利点を説明できますか?
大量のメモリを消費するアプリケーションがあり、これが注目すべき領域であるかどうかを判断しようとしています。
ソフトおよびファントム参照はJavaから来ていると思います。長い弱参照(C#のWeakReferenceコンストラクターにtrueを渡す)は、JavaのPhantomReferenceに似ていると見なされる場合があります。 C#にSoftReferenceに類似するものがある場合、それが何であるかわかりません。
弱い参照はオブジェクトの寿命を延ばさないので、すべての強い参照が範囲外になった場合にガベージコレクションを行うことができます。これらは、初期化に費用がかかる大きなオブジェクトを保持するのに役立ちますが、アクティブに使用されていない場合はガベージコレクションに使用できる必要があります。
これがアプリケーションのメモリ消費の削減に役立つかどうかは、アプリケーションの詳細に完全に依存します。たとえば、適度な数のキャッシュされたオブジェクトがぶらぶらしており、将来再利用される可能性がある場合、弱参照はキャッシュのメモリ消費を改善するのに役立ちます。ただし、アプリが非常に多数の小さなオブジェクトを処理している場合、参照オブジェクトはメモリを占有するため、弱参照により問題が悪化します。
MSDNには weak reference の説明があります。キークォートは、一番下にあります:
弱参照の使用を避けるメモリの自動解決管理の問題。代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュポリシーを開発します。
WeakReferenceを実際に目にするたびに、それはメモリ管理の問題に対する自動ソリューションとして使用されています。アプリケーションの問題に対するより良い解決策が存在する可能性があります。
WeakReferenceの素晴らしい実例は Android開発チュートリアル で説明されています。
ビュー(ImageView)に画像(ビットマップ)と画像コンテナーがあります。画像がメモリからではなく(ただし、ディスク、ネットなどから)ロードされる場合、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);
}
}
}
}
追伸この例はJavaで記述されていますが、C#開発者は理解できます。
出典: http://developersdev.blogspot.ru/2014/01/weakreference-example.html