C# 析构函数限制-从析构函数访问托管成员

C# 析构函数限制-从析构函数访问托管成员,c#,memory,destructor,finalizer,C#,Memory,Destructor,Finalizer,在C#析构函数(终结器)中,您不能访问类的托管成员,这对吗?如果这是真的,为什么? 你还知道哪些C#终结器限制 例如: class MyClass { private FileStream _fs; private IntPtr _handle; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~MyClass() {

在C#析构函数(终结器)中,您不能访问类的托管成员,这对吗?如果这是真的,为什么? 你还知道哪些C#终结器限制

例如:

class MyClass
{
    private FileStream _fs;
    private IntPtr _handle;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~MyClass()
    {
        Dispose(false);
    }

    private void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            _fs.Dispose(); // Won't be accessed from destructor
        }

        //some way to release '_handle' - this happans anyway (Called by Dispose or by Destructor)
    }
}

你可以,但这有什么意义?您所在的对象已无法访问,因此所有这些托管资源都已被GC收集。因此不需要对它们调用dispose

来自msdn

使用析构函数释放资源: 一般来说,C#不需要像使用不以垃圾收集为目标的运行时语言开发时那样多的内存管理。这是因为.NET Framework垃圾收集器隐式管理对象的内存分配和释放。但是,当应用程序封装非托管资源(如窗口、文件和网络连接)时,应使用析构函数释放这些资源。当对象符合销毁条件时,垃圾收集器将运行对象的Finalize方法

资源的明确发布 如果您的应用程序使用的是昂贵的外部资源,我们还建议您提供一种在垃圾收集器释放对象之前显式释放资源的方法。您可以通过从IDisposable接口实现Dispose方法来完成此操作,该接口将对对象执行必要的清理。这可以大大提高应用程序的性能。即使使用这种对资源的显式控制,如果对Dispose方法的调用失败,析构函数也会成为清理资源的保护措施


你可以。但这有什么意义呢?您所在的对象已无法访问,因此所有这些托管资源都已被GC收集。因此不需要对它们调用dispose

来自msdn

使用析构函数释放资源: 一般来说,C#不需要像使用不以垃圾收集为目标的运行时语言开发时那样多的内存管理。这是因为.NET Framework垃圾收集器隐式管理对象的内存分配和释放。但是,当应用程序封装非托管资源(如窗口、文件和网络连接)时,应使用析构函数释放这些资源。当对象符合销毁条件时,垃圾收集器将运行对象的Finalize方法

资源的明确发布 如果您的应用程序使用的是昂贵的外部资源,我们还建议您提供一种在垃圾收集器释放对象之前显式释放资源的方法。您可以通过从IDisposable接口实现Dispose方法来完成此操作,该接口将对对象执行必要的清理。这可以大大提高应用程序的性能。即使使用这种对资源的显式控制,如果对Dispose方法的调用失败,析构函数也会成为清理资源的保护措施


你可以。但这有什么意义呢?您所在的对象已无法访问,因此所有这些托管资源都已被GC收集。因此不需要对它们调用dispose

来自msdn

使用析构函数释放资源: 一般来说,C#不需要像使用不以垃圾收集为目标的运行时语言开发时那样多的内存管理。这是因为.NET Framework垃圾收集器隐式管理对象的内存分配和释放。但是,当应用程序封装非托管资源(如窗口、文件和网络连接)时,应使用析构函数释放这些资源。当对象符合销毁条件时,垃圾收集器将运行对象的Finalize方法

资源的明确发布 如果您的应用程序使用的是昂贵的外部资源,我们还建议您提供一种在垃圾收集器释放对象之前显式释放资源的方法。您可以通过从IDisposable接口实现Dispose方法来完成此操作,该接口将对对象执行必要的清理。这可以大大提高应用程序的性能。即使使用这种对资源的显式控制,如果对Dispose方法的调用失败,析构函数也会成为清理资源的保护措施


你可以。但这有什么意义呢?您所在的对象已无法访问,因此所有这些托管资源都已被GC收集。因此不需要对它们调用dispose

来自msdn

使用析构函数释放资源: 一般来说,C#不需要像使用不以垃圾收集为目标的运行时语言开发时那样多的内存管理。这是因为.NET Framework垃圾收集器隐式管理对象的内存分配和释放。但是,当应用程序封装非托管资源(如窗口、文件和网络连接)时,应使用析构函数释放这些资源。当对象符合销毁条件时,垃圾收集器将运行对象的Finalize方法

资源的明确发布 如果您的应用程序使用的是昂贵的外部资源,我们还建议您提供一种在垃圾收集器释放对象之前显式释放资源的方法。您可以通过从IDisposable接口实现Dispose方法来完成此操作,该接口将对对象执行必要的清理。这可以大大提高应用程序的性能。即使使用这种对资源的显式控制,如果对Dispose方法的调用失败,析构函数也会成为清理资源的保护措施

是的,您不应该访问