2012-07-24 5 views
14

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)

+2

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. –

+0

Ihr Beispielcode braucht überhaupt keine Referenz, da Sie nicht versuchen, die Referenz zu ändern. –

Antwort

26

Why is this?

Variablen erklärt in using Aussagen sind schreibgeschützt; out und ref Parameter sind nicht. So können Sie dies tun:

DisposableInt theInt = new DisposableInt(1); 
using (theInt) 
{ 
    AddOne(ref theInt); 
} 

... aber im Grunde sind Sie nicht mit die Tatsache, dass es ein ref Parameter sowieso ...

Es ist möglich, dass Sie falsch verstanden haben, was ref bedeutet wirklich. Es wäre eine gute Idee, meine article on parameter passing zu lesen, um sicherzustellen, dass Sie wirklich verstehen.

+1

Vielen Dank! Der fehlende Link für mich war, dass eine "verwendende Variable" schreibgeschützt ist. Ich denke, ich sehe warum: Weil ich dann sagen könnte, dass das = neue DisposableInt (2) * in * der Gebrauchsanweisung die Dinge königlich vermasselt! Selbst mein "funktionierender" Beispielcode ist eine schlechte Übung, denke ich. – Irinotecan

Verwandte Themen