假设我有以下一次性类和示例代码来运行它:
public class DisposableInt : IDisposable
{
private int? _Value;
public int? MyInt
{
get { return _Value; }
set { _Value = value; }
}
public DisposableInt(int InitialValue)
{
_Value = InitialValue;
}
public void Dispose()
{
_Value = null;
}
}
public class TestAnInt
{
private void AddOne(ref DisposableInt IntVal)
{
IntVal.MyInt++;
}
public void TestIt()
{
DisposableInt TheInt;
using (TheInt = new DisposableInt(1))
{
Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt));
AddOne(ref TheInt);
Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt));
}
}
}
调用
new TestAnInt().TestIt()
可以正常运行。但是,如果我更改TestIt()
,以便在using语句内部声明DisposableInt
,如下所示: public void TestIt()
{
// DisposableInt TheInt;
using (DisposableInt TheInt = new DisposableInt(1))
{
Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt));
AddOne(ref TheInt);
Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt));
}
}
我收到以下编译器错误:
Cannot pass 'TheInt' as a ref or out argument because it is a 'using variable'
为什么是这样?有什么不同,除了
using
语句完成后,该类超出范围并进入垃圾回收器?(是的,我知道我的一次性类例子很傻,我只是想让事情简单点)
最佳答案
在using
语句中声明的变量是只读的; out
和ref
参数不是。因此,您可以执行以下操作:
DisposableInt theInt = new DisposableInt(1);
using (theInt)
{
AddOne(ref theInt);
}
...但是从根本上讲,您根本不会使用它是
ref
参数的事实...您可能误解了
ref
的真正含义。阅读我的article on parameter passing以确保您真正理解是一个好主意。关于c# - C#-为什么我不能将using语句中声明的类传递为引用类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11636489/