オブジェクトがメソッドによって返されるとき、それへの参照がなくなるまで、オブジェクトは存在し続けます。その時点で、ガベージコレクションの対象になります。したがって、オブジェクトを作成したメソッドが終了したからといって、オブジェクトが破棄されることはありません。
2 に答える
これは、以下のシナリオでは、呼び出した後Run()
、a
それがプライベートオブジェクトであっても、ガベージコレクションされないことを意味します。これ_b
は、メソッドのスコープ外に存在し、まだへの参照を保持しているためa
です。
class Test
{
private B _b;
public void Run()
{
A a = new A();
_b = new B(a);
}
}
public class A
{
}
public class B
{
private A _a;
public B(A a)
{
_a = a;
}
}
あなたが持っている場合:
string Method1()
{
return new Random().Next(0, 1000).ToString();
}
次に、それを呼び出すと、Random
オブジェクトが作成され、その後すぐにオブジェクトが作成されstring
ます。
Random
呼び出しによってオブジェクトを使用してメソッドが完了すると(その本が何を言っているかに関係なくNext
、メソッドが返されたかどうかはこれとはまったく関係がないことに注意してください)。コードが到達するどこにもそれへの参照はもうないので、収集される可能性があります。
文字列が次の場所で取得された場合:
void Method2()
{
string s = Method1();
//s isn't collected here by devious forces.
Console.WriteLine(s);//this works.
}
その本は、「物は使っても魔法のように消えない。
それは実際には間違っています:
void Method3()
{
Method1();
}
メソッド method が返される前に文字列が収集されなかったと疑う理由はありません。
だけでなく:
static string blah
void Method4()
{
blah = new Random().Next(0, 10).ToString();
}
これは何も返しませんでしたが、収集されないオブジェクトを作成しました。
また:
void Method5(out string ret)
{
ret = new Random().Next(0, 10).ToString();
}
void Method 6()
{
string s;
Method5(out s);
//s isn't collected here by devious forces.
Console.WriteLine(s);//this works.
}
より良いバージョンは次のとおりです。
「実行されるコードがオブジェクトを使用できなくなると、オブジェクトが収集される可能性があります。」
より良い本を購入してください。ハーバート・シルトが何かについて何を言っているのかを人々に説明するように求めても意味がありません。率直に言って、あなたが混乱した部分よりも、理解したと思った部分の方が心配です。