当一个方法返回一个对象时,它仍然存在,直到没有它为止 引用它。此时,它受垃圾收集的影响。因此,一个对象不会 因为创建它的方法终止而被破坏。
答案 0 :(得分:1)
这意味着在下面的场景中,在您调用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;
}
}
答案 1 :(得分:0)
如果你有:
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();
}
没有理由怀疑在返回方法方法之前没有收集字符串。
但是:
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对某事的看法,因为这假设他是正确的。坦率地说,我会更担心你认为你理解的那些比你被困惑的那些东西,因为你不知道它是否真的是正确的或者是公牛队。