19

次の使い捨てクラスとそれを実行するためのサンプルコードがあるとします。

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ステートメントが終了すると、クラスがスコープ外になり、ガベージコレクターに移動すること以外は何が異なりますか?

(そして、ええ、私は私の使い捨てクラスの例が非常にばかげていることを知っています、私は問題を単純に保とうとしているだけです)

4

1 に答える 1

31

どうしてこれなの?

ステートメントで宣言された変数usingは読み取り専用です。outrefパラメータはそうではありません。だからあなたはこれを行うことができます:

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

...しかし基本的にあなたはそれがとにかくパラメータであるという事実を使用していません...ref

ref本当の意味を誤解している可能性があります。パラメータの受け渡しに関する私の記事を読んで、本当に理解していることを確認することをお勧めします。

于 2012-07-24T17:53:34.903 に答える