2012-07-24 6 views
14

は、私はそれを実行するには、次の使い捨てのクラスと例のコードがあるとします。C# - usingステートメントで宣言されたクラスを参照型として渡すことができないのはなぜですか?

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()実行を呼び出します。 DisposableIntがそうのように使用して文の中で宣言されるように、私はTestIt()を変更する場合は、:

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文でを宣言

+2

ちょうどヒント:従来、Java変数の名前は最初の文字は小文字で、キャメルは単語の境界に付けられました。あなたの 'TheInt'変数の名前を' theInt'に変更する必要があります。あなたが慣習に従えば、他人にあなたのコードを読みやすくするのに役立ちます。 –

+0

あなたのサンプルコードは参照を変更しようとしていないので、refは全く必要ありません。 –

答えて

関連する問題