2016-05-04 9 views
0

AndroidスタジオJavaからXamarin C#にコードを転送しようとしていますが、その間に2つのクラスを強く参照しないようにしなければならないという記事を思いつきました。ネストされたクラスはガベージコレクタを動作させませんか?

代替案は、このような問題を回避するために、2つのクラスのいずれか(好ましくは子クラスが正しく理解されている場合)でWeakReferenceを使用することを推奨しました。例えば

この:

public class Header { 
    List<Detail> _details = new List<Detail>(); 
} 


public class Detail { 
    Header _parent; 
} 

は、理想的には、私が使用しているこれは何

に変更する必要がありますが、これです:

public class Header { 
    List<Detail> _children = new List<Detail>(); 


    private class Detail { 
     Detail() { 
      Header.this._children.add(this); 
     } 

    } 
} 

これは強いがあることを意味しますヘッダからそのリストまでの細部への参照、および詳細からのヘッダへの参照。

garbadgeコレクタに問題がありますか?

List<Detail>List<WeakReference>に変更した方が良いでしょうか?もしそうなら、その細部が使用されていない時代の後にいつも処分されるだろうか?

ご協力いただけると助かります。

+0

GCは循環参照を処理できます。グローバルに固定されたオブジェクトからオブジェクトへのパスがあるかどうかを調べています。そうでなければ、それはきれいになる。 –

+0

あなたはそれについて確かですか?このhttps://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/memory_perf_best_practices/#weakreferencesによれば、gcが処理できなかったオブジェクトを – Cruces

答えて

2

あなたのケースではGCの問題はありません。あなたが読んだ問題は、MVVM、つまりビューモデルクラスとビュークラスを使用するときに発生します。ビュークラスは、任意のviewmodelプロパティへの強い参照を保持すべきではありません。あなたの意見を正しく処分している場合(多くの人が正しく/すべてのビューで処分しない場合)、これは当てはまりません。

はところで、あなたのJavaコードは問題なく、このように書き換えることができます:あなたは_childrenからそれを削除します。

public class Header { 
    List<Detail> _children = new List<Detail>(); 

    private class Detail { 
     public Detail(Header header) { 
      header._children.Add(this); 
     } 
    } 
} 

Detailオブジェクトはすぐに(次のGCが起こる収集するときに注意してください)として配置されます。

+0

で作成することができましたが、すべてを削除すればHeaderオブジェクトへの参照?ヘッダーとすべてのディテールオブジェクトの両方を処理しますか?または決してそれは集められないでしょうか? – Cruces

+0

この場合、すべての子オブジェクトが破棄されます。あなたの別のクラスがそれらの1つを参照していない限り。ここのケースではありません。 – Softlion

0

私はその後garbadge(原文のまま)コレクタがそれらのいずれかを配置することはないので、1は、それらの間の2つのクラスを参照して強く避けるべきであると言った記事を思い付きました。

これはC#に関する記事で、具体的には間違っていました。これは、ガベージコレクタ参照カウントの問題の可能性があります。 .NET GCは決してリファレンスカウントではありません。

同じグラフ内の他のオブジェクトを参照している参照数に関係なく、オブジェクトグラフ全体に到達できなくなったときに検出できます。

は、私が使用していることはこれです:あなたが言うも

public class Header { 
    List<Detail> _children = new List<Detail>(); 


    private class Detail { 
     Detail() { 
      Header.this._children.add(this); 
     } 

    } 
} 

私はあなたがこれはあなたがJavaで何をしてきたある意味推測します。 C#では、ネストされたクラスについてはParent.thisと類似の概念はありません。ネストされたクラスのインスタンスは、そのようなモデルを明示的に作成する場合にのみ、外部クラスのインスタンスに関連付けられます。


私はいくつかの作業は、参照カウントのGCのサイクル検出器を持つに入ったが、私はあなたにこのために当該技術分野の現在の状態を伝えることができなかったと信じています。

+0

はい、確かにJavaにあります。私はCに変換しようとしているコードです# 私が話している記事は、この1つです https://developer.xamarin.com/guides/cross-プラットフォーム/デプロイメント、_testing、_and_metrics/memory_perf_best_practices /#weakreferences – Cruces