2016-08-21 5 views
-1

ことの私はこれを持っているとしましょう:ガベージコレクションのための具体的な言及を無視

public static class FooKeeper 
{ 
    public static List<Foo> foos = new List<Foo>(); 
} 


public class Foo 
{ 
    public Foo() 
    { 
     FooKeeper.foos.Add(this); 
    } 
} 

私はFoo型のオブジェクトがガベージコレクトを取得するときに、私は手動でリストから削除することをやりたいですFooKeeperクラス。 FooKeeperは常にそれらを参照するため、Fooオブジェクトはガベージコレクションできないため、もちろん意味がありません。

FooKeeperのリストには、その参照を無視するようにGCに指示する方法はありますか?またはこれを回避する他の方法?

+2

何をしようとしていますか?なぜガベージコレクションのサイクルに干渉しようとしているのですか?あなたのクラスはそれを保証するものはないようです。インスタンスが参照されている限り、GCはそれをそのままにします。参照されていない場合は、通常は何もする必要はありません.GCが実行されると、GCはそれを取得します。 – xxbbcc

+0

私はUnity3d用のタイマークラスをやろうとしていますが、必要であれば完全なコードを表示できますが、ユニティの仕組みを理解する必要があり、関連性はないと思います。 –

+0

あなたは私の質問を誤解しました。あなたはオブジェクトの静的な静的リストを持っています - リストによって所有されているため、これらのオブジェクトが何であるかは関係ありません。リストがこれらのオブジェクトの所有者でない場合、おそらくあなたはそれらをどのように保存するか考えるべきです。あなたの質問とコメントに基づいて、これは私にとってX/Yの問題のように聞こえる - これがあなたが解決しようとしている問題が何であるか尋ねた理由です。 – xxbbcc

答えて

3

WeakReferenceを使用して目的を達成してください。

public static List<WeakReference<Foo>> foos = new List<WeakReference<Foo>>(); 
+0

私はそれをすることはできないと思う。 「WeakReference test;」と入力するとコンパイラは「非ジェネリック型は型引数で使用できません」と言います。リストに追加するとき、私はこれを試みました:FooKeeper.foos.Add(新しいWeakReference(this).TargetをFooとして);オブジェクトは収集されません。 –

+0

.Netフレームワークを4.5バージョンまで更新する必要があります。 –

+0

これは問題です。私はUnityと一緒に働いていますが、それは.Net 4.5 =/ –

関連する問題