- 此问题在此处已有答案**:
Setting an object to null vs Dispose()(3个答案)
17小时前关门了。
为了理解这个C#dispose是如何工作的,我创建了一个名为Student的类并实现了IDisposable。
class Student: IDisposable
{
private bool disposedValue;
public int id { get; set; }
public string name { get; set; }
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: dispose managed state (managed objects)
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
// TODO: set large fields to null
disposedValue = true;
}
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
我怎么知道上面的代码实际上是在释放我的对象?因为一旦我调用dispose方法,那么我也可以访问我的对象属性?
public static void Main()
{
CreateStudentClass();
}
static void CreateStudentClass()
{
Student s = new Student();
s.Dispose();
Console.WriteLine(s.name); // I can able to access object properties.
}
垃圾回收什么时候会回收我的学生对象s的内存?我知道上面的代码是托管代码,一旦它超出了我用来创建对象的方法的范围,GC就会自动回收它的内存。
Dispose方法的用途是什么?因为它没有实现,在所有的YouTube视频和博客中,这也是他们实现Dispose方法的方式。
如果我上面的代码是错误的,让我知道如何妥善处置我的学生对象。提前感谢。
2条答案
按热度按时间ql3eal8s1#
Dispose方法设计为在您要释放对象所持有的资源(如非托管资源,如文件句柄或数据库连接)时调用。
要释放Student对象,您应该向Dispose(bool disposing)方法添加代码,以释放该对象持有的任何资源。例如,文件句柄。
y4ekin9u2#
不,
Dispose()
* 不会 * 释放您的对象或使其符合垃圾回收的条件。Dispose用于需要清理的对象(例如文件句柄、网络连接等)。对于您的Student
对象,我认为没有必要使用Dispose方法。大多数情况下,当且仅当您保留对其他可释放对象的引用时,才需要在对象上实现Dispose。很少需要跟踪非托管资源(除了通过已托管对象,如
Stream
示例)。