我正在尝试创建一个通用方法来处理实现的对象I一次性,称为DisposeObject()
为了确保我正在处理原始引用指向的对象,我尝试通过引用传递对象。
但我收到一个编译错误,上面写着
“ref”参数类型与参数类型不匹配
在下面的(简化的)代码中,两者_Baz
and _Bar
实施I一次性.
![alt text](https://farm4.static.flickr.com/3576/3479637489_d92cf9f406_o.png)
所以问题是,
- 为什么我会收到此错误?
- 有办法绕过它吗?
[UPDATE]从到目前为止提供的答案来看,只要我不将 IDisposable 参数设置为 null,我就可以简单地按值传递对象,而无需使用ref
。
我现在又遇到一个麻烦,是否将一次性物品设置为null
或不在范围内DisposeObject
方法。
以下是完整性的完整来源:
public class Foo : IDisposable
{
private Bar _Bar;
private Baz _Baz;
private bool _IsDisposed;
~Foo() { Dispose(false); }
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(ref _Baz);
DisposeObject(ref _Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(ref IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
obj = null;
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
public class Bar : IDisposable
{
public void Dispose() {}
}
public class Baz : IDisposable
{
public void Dispose() {}
}
[RESULT]
我删除了将参数设置为 null 的代码(obj = null;
) 之内DisposeObject
所以最终的代码就成了。
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(_Baz);
DisposeObject(_Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
这是您的示例的一个选项(现在无法针对编译器验证它,但您会明白的):
private void DisposeObject<T>(ref T obj) where T : class, IDisposable
{
// same implementation
}
要调用它,请使用
DisposeObject<Baz>(ref _Baz);
DisposeObject<Bar>(ref _Bar);
正如其他评论中指出的,您得到的编译器错误有其自己的目的(防止您在方法内分配某些其他类型的 IDisposable,从而导致不一致的状态)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)