当无法访问时,C#对象是否从内存中删除

时间:2014-05-10 06:14:34

标签: c# .net memory-management garbage-collection clr

static void Main(string[] args)
{
    foo f1 = new foo();
    string s1 = f1.fooMethod();

    string s2 = (new foo()).fooMethod();

    // Does anonymous object destroys here?
    // some more code....
    //....
    //....
    //....
    //....
    // f1 is accessible here also
    // some more code....
    //....
    //....
    //....
    //....
    // f1 is accessible here also
}

class foo
{
    public string fooMethod()
    {
        return "fooMethod called";
    }
}

在上面的代码中,我使用(new foo())语法创建了一个匿名对象(我想这就是这些对象被称为)和一个f1对象。

现在f1可以在整个代码块中访问,但匿名对象不是(当然)。 问题是:

  1. 这个匿名对象是否会在下一行中销毁 工作完成了?
  2. 这种创建匿名对象的方式是好还是 与f1对象创建相比较差(特别是当我们 需要只调用该类的一个方法,如本例)?

2 个答案:

答案 0 :(得分:3)

  

我想这就是这些对象的名称

我对此不太确定。 MSDN无法识别匿名对象。它只是一个对象,你没有提供比你需要更长的参考。但是,CLR会保留引用,直到进行垃圾回收。

  

这个匿名对象一旦完成工作就会在下一行中销毁吗?

不一定。

  

与f1对象创建相比,这种创建匿名对象的方式是好还是坏

不,没关系。我将在接下来的几行中解释GC的基础知识。

  

那么在.NET中如何回收内存呢?

为资源(例如对象)分配内存时,它将存储在托管堆上的第0代中。当这一代充满了对象时,GC运行

  1. 使用标志0
  2. 标记所有对象
  3. 检查所有根,如果根引用了对象,则该对象标记为标记1
  4. 带有标志1的所有对象都将移至下一代,并回收当前已检查的其余代数。这意味着,在某些情况下,您的两个对象可以完全同时存在。

    这绝不是.NET GC的完整描述,只是一个介绍。如果您有更详细的信息,请阅读一些articlebook

答案 1 :(得分:0)

当您使用word' access'在你的评论中,实际上你的意思是变量范围。当你使用word' destroy'时,实际上你的意思是垃圾收集。它们完全不同。一个是C#语法,另一个是CLR运行时行为。

回答你的具体问题:

  1. 没有
  2. 没有好或坏。在你的代码中,它们是相同的。无论你如何实例化foo,在整个方法中都会创建一个且只有一个实例。