.net Dispose方法真的是处理对象吗?我找不到任何区别[duplicate]

velaa5lx  于 2022-12-24  发布在  .NET
关注(0)|答案(2)|浏览(119)
    • 此问题在此处已有答案**:

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方法的方式。
如果我上面的代码是错误的,让我知道如何妥善处置我的学生对象。提前感谢。

ql3eal8s

ql3eal8s1#

Dispose方法设计为在您要释放对象所持有的资源(如非托管资源,如文件句柄或数据库连接)时调用。
要释放Student对象,您应该向Dispose(bool disposing)方法添加代码,以释放该对象持有的任何资源。例如,文件句柄。

class Student: IDisposable
{
    private bool disposedValue;
    private FileStream fileStream;

    public int id { get; set; }
    public string name { get; set; }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                // Dispose of managed resources
                fileStream?.Dispose();
            }

            // Dispose of unmanaged resources
            fileStream = 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);
    }

//etc...
}
y4ekin9u

y4ekin9u2#

不,Dispose() * 不会 * 释放您的对象或使其符合垃圾回收的条件。Dispose用于需要清理的对象(例如文件句柄、网络连接等)。对于您的Student对象,我认为没有必要使用Dispose方法。
大多数情况下,当且仅当您保留对其他可释放对象的引用时,才需要在对象上实现Dispose。很少需要跟踪非托管资源(除了通过已托管对象,如Stream示例)。

相关问题