“从方法和垃圾收集中返回对象”这段是什么意思? (来自C#4.0 Herbert Schildt)

时间:2012-09-04 16:49:41

标签: c#-4.0 c#-3.0

当一个方法返回一个对象时,它仍然存在,直到没有它为止 引用它。此时,它受垃圾收集的影响。因此,一个对象不会 因为创建它的方法终止而被破坏。

2 个答案:

答案 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对某事的看法,因为这假设他是正确的。坦率地说,我会更担心你认为你理解的那些比你被困惑的那些东西,因为你不知道它是否真的是正确的或者是公牛队。