3

気にしないでください、私は何かが足りないかもしれません。次のシナリオについて説明する必要があります。オブジェクトaに静的リストへの参照とその静的リストのエントリが含まれていて、オブジェクトaがスコープ外の場合、ガベージコレクションされますか?オブジェクトaの静的リストへの参照と、そのリスト内のエントリへの参照を、適格になる前にnullに設定する必要がありますか?

静的リストにはアプリケーションの存続期間中存続するオブジェクトが含まれていることを理解しているので、オブジェクトまだその静的リストのエントリを参照しているので、まだ存続しているオブジェクトのメインの依存関係オブジェクトグラフに残っていると思いましたか?

前もって感謝します

4

2 に答える 2

4

あなたの場合、静的リストは存続しますが他の場所からアクセスできず、メモリに保持する意味がないため、ガベージコレクションされます。静的リストへの参照を null にする必要はありません。

于 2012-09-03T14:13:11.657 に答える
2

まず、オブジェクトはスコープから外れませんが、変数は外れます。ほとんどの場合、違いはセマンティクスの 1 つですが、ここでは重要です。

あなたが話していることの具体的な例を作成しましょう:

private static List<string> static_strings = new List<string>();//this won't be
                                                                //collected unless we
                                                                //assign null or another
                                                                //List<string> to static_strings
public void AddOne()
{
  string a = new Random().Next(0, 2000).ToString();//a is in scope, it refers
                                                   //to a string that won't be collected.
  static_strings.Add(a);//now both a and the list are ways to reach that string.
  SomeListHolder b = new SomeListHolder(static_strings);//can be collected
                                                        //right now. Nobody cares
                                                        //about what an object refers
                                                        //to, only what refers to it.
}//a is out of scope.
public void RemoveOne()
{
  if(static_strings.Count == 0) return;
  a = static_strings[0];//a is in scope.
  static_strings.RemoveAt(0);//a is the only way to reach that string.
  GC.Collect();//Do not try this at home.
  //a is in scope here, which means that we can write some code here
  //that uses a. However, garbage collection does not depend upon what we
  //could write, it depends upon what we did write. Because a is no
  //longer used, it is highly possible that it was collected because
  //the compiled code isn't going to waste its time holding onto referenes
  //it isn't using.
}

ここに見られるように、スコープは何でもなく、到達可能性がすべてです。

static を参照するオブジェクトの場合、それが参照するものは無関係であり、それを参照するものだけです。

特に、これは、一部の参照カウント ガベージ コレクション アプローチとは異なり、循環参照がアイテムの収集を妨げないことを意味することに注意してください。

于 2012-09-03T14:41:04.720 に答える