Angenommen, ich die folgende Einweg-Klasse und Beispielcode haben, um sie auszuführen:C# - Warum kann ich eine in einer using-Anweisung deklarierte Klasse nicht als Referenztyp übergeben?
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));
}
}
}
aufrufen new TestAnInt().TestIt()
läuft gut. Wenn ich jedoch TestIt()
ändern, so dass DisposableInt
innerhalb der using-Anweisung wie so erklärt:
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));
}
}
Ich erhalte den folgenden Compiler-Fehler:
Cannot pass 'TheInt' as a ref or out argument because it is a 'using variable'
Warum ist das? Was ist anders, wenn die using
Anweisung nicht abgeschlossen ist, außer der Klasse außerhalb des Geltungsbereichs und zum Garbage Collector?
(und ja, ich weiß, dass meine Einweg-Klasse Beispiel ist ziemlich dumm, ich bin nur Dinge einfach zu halten versuchen)
Nur ein Tipp: Konventionell werden Java-Variablen mit dem ersten Buchstaben in Kleinbuchstaben und camelCased in Wortgrenzen benannt. Ihre 'TheInt'-Variable sollte umbenannt werden in' theInt'. Es hilft der Lesbarkeit Ihres Codes für andere, wenn Sie Konventionen befolgen. –
Ihr Beispielcode braucht überhaupt keine Referenz, da Sie nicht versuchen, die Referenz zu ändern. –