- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在.NET中,什么情况下应该使用GC.SuppressFinalize()
?
使用这种方法给我带来了什么好处?
最佳答案
SuppressFinalize
只能由具有终结器的类调用。它通知垃圾收集器 (GC) this
对象已完全清理。
当你有终结器时,推荐的 IDisposable
模式是:
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// called via myClass.Dispose().
// OK to use any private object references
}
// Release unmanaged resources.
// Set large fields to null.
disposed = true;
}
}
public void Dispose() // Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass() // the finalizer
{
Dispose(false);
}
}
通常,CLR 在创建对象时使用终结器密切关注对象(使创建它们的成本更高)。 SuppressFinalize
告诉 GC 该对象已正确清理,不需要进入终结器队列。它看起来像一个 C++ 析构函数,但并不像一个析构函数。
SuppressFinalize
优化并非微不足道,因为您的对象可以在终结器队列中等待很长时间。请注意,不要试图对其他对象调用 SuppressFinalize
。这是一个等待发生的严重缺陷。
设计指南告诉我们,如果您的对象实现了 IDisposable
,则终结器不是必需的,但如果您有终结器,则应该实现 IDisposable
以允许确定性清理您的对象类。
大多数时候,您应该能够使用 IDisposable
来清理资源。当您的对象持有非托管资源并且您需要保证这些资源被清理时,您应该只需要一个终结器。
注意:有时编码人员会添加一个终结器来调试他们自己的 IDisposable
类的构建,以测试代码是否已正确处理他们的 IDisposable
对象。
public void Dispose() // Implement IDisposable
{
Dispose(true);
#if DEBUG
GC.SuppressFinalize(this);
#endif
}
#if DEBUG
~MyClass() // the finalizer
{
Dispose(false);
}
#endif
关于c# - 我什么时候应该使用 GC.SuppressFinalize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151051/
多次调用 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; /
我是一名优秀的程序员,十分优秀!