c# - 实现 C# IDisposable
问题描述
我试图弄清楚在使用 IDisposable 时在 C# 中处理属性需要做什么。我可以看到模板,但我不确定实际处理对象。
我正在使用此站点上给出的示例: https ://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
我添加了 3 个属性:
privInt:私有值类型。我会处理这个,因为它可以保存在堆上,所以可能需要 GC?如果我愿意那么如何,不能设置为 null 或调用 dispose?如果不是,那么我认为它必须留给 GC - 但是释放资源不是 Dispose 的重点吗?
NonIDisClassInstance - 我是否设置为空?够了吗
任何人都可以在下面评论我的实施并就正确/错误提出建议。
IDisClass - 只需调用 dispose
class BaseClass : IDisposable
{
// Flag: Has Dispose already been called?
bool disposed = false;
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
//Private value type
private int privInt;
//Private class that does not implement IDisposable
Private NonIDisClass NonIDisClassInstance;
//Private class that does implement IDisposable
Private IDisClass IDisClassInstance;
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any other managed objects here.
//
}
// Free any unmanaged objects here.
DisposeOfThis = ????;
NonIDisClassInstance = null;
IDisClassInstance.Dispose();
disposed = true;
}
~BaseClass()
{
Dispose(false);
}
}
解决方案
GC.SuppressFinalize(this);
如果您正在使用非托管内存,则只需要一个析构函数。如果不是,您可以放心地忽略它。- 在您的
Dispose
实现调用this.IDisClassInstance?.Dispose();
中,这就是您所需要的。
您的代码可以浓缩于此。
class BaseClass : System.IDisposable
{
public virtual void Dispose()
{
// never throw an exception from Dispose so prevent an NRE by using ?.
this.IDisClassInstance?.Dispose();
}
//Private class that does not implement IDisposable
private object NonIDisClassInstance;
//Private class that does implement IDisposable
private IDisposable IDisClassInstance;
}
请记住,使用 Dispose 不一定要释放内存,而是要清理/释放可能还包括内存的非托管资源。诸如打开文件流或数据库连接或网络连接之类的东西。
请注意,您的派生类型可以覆盖Dispose
,但那些被覆盖的方法应该包括一个调用,base.Dispose();
以便释放基类的托管资源。
推荐阅读
- mongodb - Mongo DB 内存不足崩溃
- django - 是 Django-cms 插件,Aldryn 新闻/博客;可扩展?
- db2 - 删除表以静默方式从子表中删除外键约束
- php - Laravel - 在路由列表中找不到错误 ResetPasswordController
- rust - 使用不同“种类”元素构建枚举的宏
- capnproto - 如何从 java 中的 protobuf.ByteString 获取 MessageReader
- java - 代码输出不在输出/调试面板中,而是在 VSCode Java 中的终端
- rabbitmq - 从 Qpid JMS 客户端启用 AMQP 1.0 插件连接到 RabbitMQ 3.7.18 时出现错误匹配错误
- python - 在 Python 中按行计算文件中单词的出现次数
- gcloud - google-cloud-sdk“gcloud 项目列表”不再显示项目列表