【发布时间】:2010-10-22 02:27:41
【问题描述】:
我正在尝试创建一个通用方法来处理实现IDisposable 的对象,称为DisposeObject()
为了确保我正在处理原始引用指向的对象,我试图通过引用传递一个对象。
但我收到一个编译错误提示
“ref”参数类型与参数类型不匹配
在下面的(简化的)代码中,_Baz 和 _Bar 都实现了 IDisposable。
所以问题是,
- 为什么会出现此错误?
- 有没有办法绕过它?
[更新]
从到目前为止提供的答案来看,只要我不将 IDisposable 参数设置为 null,我就可以简单地按值传递对象,而无需使用 ref。
我现在遇到了另一个麻烦,是否在DisposeObject 方法中将一次性对象设置为null。
这是完整的完整来源:
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() {}
}
[结果]
我删除了在DisposeObject 中将参数设置为 null (obj = null;) 的代码
所以最终的代码就变成了。
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... */ }
}
【问题讨论】:
-
我看不出这里使用参考参数的具体原因。你能详细说明一下吗?
-
@Noldorin:我最初的实现是处理一个参数并将其设置为 null。 “obj == 空;”这就是“ref”的原因。
-
obj == null 是一个比较,而不是一个赋值。 obj = null 是一个赋值。
-
@Adam:你说得对,错字......应该有一个“=”。
-
这是通过引用传递引用类型参数的完全正当理由。
标签: c# dispose idisposable pass-by-reference