Предположим, у меня есть следующий одноразовый класс и пример кода для его запуска:
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()
так, чтобы DisposableInt
объявлялся внутри оператора using следующим образом:
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
?
(и да, я знаю, что мой пример одноразового класса довольно глупый, я просто стараюсь держать дело простым)