次の使い捨てクラスとそれを実行するためのサンプルコードがあるとします。
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()
は問題なく実行されます。ただし、次のようにusingステートメント内で宣言されるように変更すると、次のようになりますTestIt()
。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
ステートメントが終了すると、クラスがスコープ外になり、ガベージコレクターに移動すること以外は何が異なりますか?
(そして、ええ、私は私の使い捨てクラスの例が非常にばかげていることを知っています、私は問題を単純に保とうとしているだけです)