- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有几个问题无法得到正确的答案。
1) 当我们没有析构函数时,为什么要在 Dispose 函数中调用 SuppressFinalize。
2) Dispose 和 finalize 用于在对象被垃圾回收之前释放资源。无论它是托管资源还是非托管资源,我们都需要释放它,然后为什么我们需要在 dispose 函数中设置一个条件,当我们从 IDisposable:Dispose 调用这个被覆盖的函数时说 pass 'true' 并在从 finalize 调用时传递 false。
下面是我从网上复制的代码。
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
如果我删除 bool 保护的 Dispose 函数并实现如下所示会怎样。
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose();
}
public void Dispose()
{
// Code to dispose the managed resources of the class
// Code to dispose the un-managed resources of the class
isDisposed = true;
// Call this since we have a destructor . what if , if we don't have one
GC.SuppressFinalize(this);
}
}
最佳答案
我在这里冒险,但是...大多数人不需要需要成熟的处置模式。它旨在直接访问非托管资源(通常通过 IntPtr
)和继承。大多数时候,这两者实际上都不是必需的。
如果您只是持有对实现 IDisposable
的其他对象的引用,您几乎肯定不需要终结器 - 直接持有资源的任何对象都负责处理它。你可以做这样的事情:
public sealed class Foo : IDisposable
{
private bool disposed;
private FileStream stream;
// Other code
public void Dispose()
{
if (disposed)
{
return;
}
stream.Dispose();
disposed = true;
}
}
请注意,这不是线程安全的,但这可能不会成为问题。
通过不必担心子类直接持有资源的可能性,你不需要抑制终结器(因为没有终结器)——你也不需要提供子类自定义处置的方法任何一个。没有继承,生活会更简单。
如果您确实需要允许不受控制的继承(即您不愿意打赌子类会有非常特殊的需求),那么您需要采用完整模式。
请注意,使用 .NET 2.0 中的 SafeHandle
,与 .NET 1.1 相比,您需要自己的终结器的情况甚至更少。
为了解决您关于为什么首先有一个 disposing
标志的观点:如果您在终结器中运行,您引用的其他对象可能已经被终结。您应该让它们自行清理,并且您应该只清理您直接拥有的资源。
关于c# - 当我们没有析构函数时为什么要调用 SuppressFinalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605412/
多次调用 GC.SuppressFinalize(object) 有什么缺点吗? protected Dispose(bool) 方法 dispose pattern 检查它之前是否被调用,但在公共(
我有几个问题无法得到正确的答案。 1) 当我们没有析构函数时,为什么要在 Dispose 函数中调用 SuppressFinalize。 2) Dispose 和 finalize 用于在对象被垃圾回
在 .NET 中 Task.Delay() 的引用源中,我遇到了 a snippet of code : // ... and create our timer and make sure that
Java 是否有相当于 .Net 的 GC.SuppressFinalize ? 在 .Net 中,SuppressFinalize 用于 dispose pattern避免 relatively h
我在实践中的观察是GC.SuppressFinalize并不总是抑制对终结器的调用。尽管如此,终结器可能还是被调用了。因此,我想知道 GC.SuppressFinalize 是否具有请求的性质,而不是
刚看完这篇文章,“Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework ”,作者 Jeffre
在.NET中,什么情况下应该使用GC.SuppressFinalize()? 使用这种方法给我带来了什么好处? 最佳答案 SuppressFinalize 只能由具有终结器的类调用。它通知垃圾收集器
因为 finalizer/IDisposable 和所谓的“IDisposable 模式”主题往往会引发大量故作姿态、武断和好战的观点(不是-分别是 here 、 here 、 here 等等),我真
我可以在同一个类中实现这两个方法吗? public class MyClass : IDisposable { // some implementation // if i missed to
有没有办法检测对象是否调用了 GC.SuppressFinalize? 我有一个看起来像这样的对象(为清楚起见省略了完整的 Dispose 模式): public class ResourceWrap
我为我的代码使用默认的 IDisposable 实现模板(模式)。 片段: public void Dispose() { Dispose(true); GC.SuppressFina
出于某种原因FXCop seems to think我应该在 Dispose 中调用 GC.SuppressFinalize,无论我是否有终结器。 我错过了什么吗?是否有理由在没有定义终结器的对象上调
我正在阅读“The C# Language”,第 4 版,它讨论垃圾收集如下: "BILL WAGNER: The following rule is an important difference
是的,我知道如何使用GC.SuppressFinalize() - 解释了here .我读过很多次使用 GC.SuppressFinalize() 从终结队列中删除对象,我认为这是好的,因为它使 GC
我在使用供应商库时遇到了一些问题,有时库计算出的实体应该始终包含有效数据时为空。 功能代码(与供应商调试问题后)大致如下: Task.Factory.StartNew(() => Valida
正如问题所述,我只是想知道,因为有人问过我,但我不知道,这有任何原因吗? 最佳答案 当一个类没有定义终结器(析构函数)时,在该类的实例上调用 SuppressFinalize() has no eff
有些类(例如 DataTable)已经在其构造函数中调用了 SuppressFinalize,因此没有必要在其上调用处置/使用。 (因为dispose是为了早点release但是没有release)
我有一个简单的类 MyDataClass,其成员 (obj) 实现了 IDisposable: public class MyDataClass : IDisposable { private
我刚刚实现了 Dispose 模式,当我刚刚键入 GC.SuppressFinalize(this) 行时,我想知道是否有使用 以外的东西的用例this 作为方法的参数。 这是典型的模式: publi
我有以下代码: public void Dispose() { if (_instance != null) { _instance = null; /
我是一名优秀的程序员,十分优秀!