" Return Object from a Method and Garbage Collection"这一段是什么意思?(来自 C#4.0 赫伯特·希尔特 )



当一个对象由一个方法返回时,它会一直存在,直到不再存在引用。在这一点上,它将受到垃圾回收。因此,对象不会仅仅因为创建它的方法终止而被销毁。

这意味着在下面的场景中,在调用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对某事的看法是没有意义的,因为这是假设他是正确的。坦率地说,我更担心你认为自己理解的部分,而不是你被困惑的部分,因为你不知道它是真的正确还是愚蠢。

最新更新