【问题标题】:Does C# object removes from memory when inaccessibleC# 对象在不可访问时是否从内存中删除
【发布时间】:2014-06-27 23:16:29
【问题描述】:
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 对象创建相比不好(特别是当我们 在这种情况下只需要调用该类的一个方法)?

【问题讨论】:

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


    【解决方案1】:

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

    我不太确定。 MSDN 无法识别匿名对象。它只是一个对象,您不会保留比您需要的时间更长的引用。但是,CLR 会保留引用,直到发生垃圾回收。

    该匿名对象在工作完成后会在下一行销毁吗?

    不一定。

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

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

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

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

    1. 用标志 0 标记所有对象
    2. 检查所有根,如果根指的是对象,则该对象被标记为 1

    所有标记为 1 的对象都被移动到下一代,当前检查的其余部分被回收。这意味着,在某些情况下,您的两个对象可以存在完全相同的时间。

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

    【讨论】:

      【解决方案2】:

      当您在评论中使用“可访问”一词时,实际上您的意思是变量范围。当您使用“销毁”一词时,实际上您的意思是垃圾收集。它们是完全不同的东西。一个是 C# 语法,另一个是 CLR 运行时行为。

      回答您的具体问题:

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

      【讨论】:

        猜你喜欢
        • 2011-10-11
        • 1970-01-01
        • 2015-05-09
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多