Jun*_*ior 0 .net c# dispose idisposable
我需要编写一个类,我想让消费者通过using(...)在C#中包装带有语句的代码来处理代码.
为此,我必须实现Microsoft的IDisposable界面.
基于Microsoft实现它的方法,我应该做这样的事情
这样的通用接口
public interface ISomeClass : IDisposable
{
// ... some methods to include
}
public class SomeClass : ISomeClass
{
private readonly TimeTrackerContext _context;
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed && disposing && _context != null)
{
_context.Dispose();
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试以正确的方式学习C#,因此我对此实现有一些疑问.
题
为什么我真的需要有一个属性告诉我在处理之前对象是否已被处置?
换句话说,_context在处理它之前,我不能只检查是否为null吗?像这样的东西
public class SomeClass : ISomeClass
{
private readonly TimeTrackerContext _context;
private void SelfDisposing()
{
if (_context != null)
{
_context.Dispose();
}
}
public void Dispose()
{
SelfDisposing();
GC.SuppressFinalize(this);
}
private void SelfDisposing(bool disposing)
{
if (_context != null && !this.disposed && disposing)
{
_context.Dispose();
}
this.disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
_context null如果对象已被处理,则不会出现.它仍将引用已经处置的对象.
现在,如果你可以确定你的对象是否被处置而不需要存储一个布尔变量,那就没关系了.
你不应该拥有的是GC.SuppressFinalize 你的对象没有终结器,所以没有什么可以抑制的.
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |