当一个对象由一个方法返回时,它会一直存在,直到不再存在引用。在这一点上,它将受到垃圾回收。因此,对象不会仅仅因为创建它的方法终止而被销毁。
这意味着在下面的场景中,在调用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
对象。
一旦通过调用Next
使用Random
对象完成该方法(请注意,无论该方法是否返回,都与此无关)。任何代码到达的地方都没有对它的引用,所以它可能会被收集起来。
如果字符串是在中获得的
void Method2()
{
string s = Method1();
//s isn't collected here by devious forces.
Console.WriteLine(s);//this works.
}
所以这本书说"当你使用它们时,东西不会神奇地消失
它实际上是不正确的,在:
void Method3()
{
Method1();
}
没有理由怀疑在方法方法返回之前没有收集字符串。
但也包括:
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.
}
这里有一个更好的版本:
"一旦任何将运行的代码都无法使用该对象,它就可能被收集。"
买一本更好的书,要求人们解释Herbert Schildt对某事的看法是没有意义的,因为这是假设他是正确的。坦率地说,我更担心你认为自己理解的部分,而不是你被困惑的部分,因为你不知道它是真的正确还是愚蠢。