什么是.NET对象生命周期?

Rob*_*ean 14 .net object

.NET中对象的对象生命周期是什么?

据我所知,它是:

  1. 创建的对象 - 调用的构造函数(如果存在)
  2. 使用的方法/属性/字段
  3. 对象被破坏 - 被调用的处理(如果存在)
  4. 在某些时候由GC调用的析构函数

San*_*ken 19

Dispose不会自动调用; 你需要调用它,或者使用一个使用块,例如.

using(Stream s = File.OpenRead(@"c:\temp\somefile.txt"))
    // Do something with s
Run Code Online (Sandbox Code Playgroud)

如果GC存在,则仅由GC调用终结器.使用终结器会导致您的课程分两步收集; 首先将对象放入终结器队列,然后调用终结器并收集对象.没有终结器的对象被直接收集.

指南是Dispose删除托管和非托管资源,终结器只清理非托管资源.当Dispose方法释放了非托管资源时,它可以调用GC.SuppressFinalize以避免将对象长时间放在终结器队列上.有关配置模式的正确样本,请参阅MSDN.


Mar*_*ell 17

就像边缘情况一样......你可以在不使用ctor的情况下创建对象:

class Foo {  
    public Foo() {
        message += "; ctor";
    }
    string message = "init";
    public string Message { get { return message; } }
}
static class Program {
    static void Main() {
        Foo foo = new Foo();
        Console.WriteLine(foo.Message); // "init; ctor"
        Foo bar = (Foo)System.Runtime.Serialization.FormatterServices
            .GetSafeUninitializedObject(typeof(Foo));
        Console.WriteLine(bar.Message); // null
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这在反序列化期间主要由BinaryFormatter使用 (3认同)

Dav*_*itt 6

以下是我所知道的步骤:

  1. 加载程序集
  2. 执行静态初始化程序
  3. "新"电话:
    1. 分配内存
    2. 执行非静态初始化程序
    3. 执行构造函数
  4. 现在可以使用该实例了
  5. 在对象的最后一次引用消失后:如果对象没有终结器,它现在可以收集了; 如果对象终结器,则将其放在终结器队列中.
  6. (可选)终结器队列中的对象在特殊线程中调用其终结器; 如果应用程序仍然没有引用该对象,它现在也有资格进行垃圾回收
  7. 垃圾收集器释放内存

正如其他人已经指出的那样,Dispose()必须由用户调用,因为运行时不会对其进行操作.


Dmi*_*erg 5

是问题的详细描述.首先,Dispose不是由运行时调用的,你必须自己调用它.也没有析构函数,但是终结器:如果一个对象覆盖了Finalized方法,则在该对象不再可供应用程序访问时调用它.可能会发生在最终确定期间,对象再次可访问(例如,在全局对象中存储对自身的引用),因此它将返回到模型的第2步.GC对象中还有一些方法可以让用户控制对象的最终化.