C#でプロパティを「out」パラメータとして渡す


81

私が持っているとしましょう:

public class Bob
{
    public int Value { get; set; }
}

Valueメンバーを次のようなoutパラメーターとして渡したい

Int32.TryParse("123", out bob.Value);

しかし、「 'out'引数は変数として分類されていません」というコンパイルエラーが発生します。 これを達成する方法はありますか、それとも変数を抽出する必要がありますか?

int value;
Int32.TryParse("123", out value);
bob.Value = value;

回答:


83

自動実装されたプロパティの代わりに、フィールドと「通常の」プロパティを明示的に使用する必要があります。

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}

次に、フィールドをoutパラメーターとして渡すことができます。

Int32.TryParse("123", out bob.value);

しかしもちろん、フィールドはプライベートであるため、同じクラス内でのみ機能します(そしてそうあるべきです!)。

プロパティでは、これを実行できません。参照によってプロパティ渡したり、outパラメータとして使用したりできるVBでも、基本的に追加の一時変数があります。

の戻り値を気にしない場合はTryParse、いつでも独自のヘルパーメソッドを作成できます。

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}

次に、以下を使用します。

bob.Value = Int32Helper.ParseOrDefault("123");

そうすれば、複数の場所でこれを行う必要がある場合でも、単一の一時変数を使用できます。


1
最初のアプローチの問題は、(プロパティではなく)フィールドを直接使用する場合、プロパティに存在する可能性のある検証ルールをバイパスする可能性があることだと思います
Andreas Grech

3
@Jon:ParseOrDefaultの例では、int.Parseをint.TryParseに変更したいと思います。
shahkalpesh 2009

8
ところで、出力パラメータとしてプロパティを設定できない理由は、プロパティの設定は実際には関数呼び出しであり、内部を見ると割り当てがないためです。
Dirk Vollmar 2009

3
プロパティをrefまたはoutパラメータとして渡すための適切なシンタックスシュガーを確認したいと思います。コンパイラに作業をしてみましょう。私よりも高速です。
Ignacio Soler Garcia

1
@SoMoS:値型であるかどうかは、私のコメントに違いはありません。メソッド内のパラメーターへの変更はすぐに有効になるか、有効になりません。これは、例外がスローされた場合の動作にも影響します。
Jon Skeet

7

あなたはそれを達成することができますが、プロパティではできません。

public class Bob {
    public int Value { get; set; } // This is a property

    public int AnotherValue; // This is a field
}

あなたは使用することはできませんoutValueが、あなたは上のことができますAnotherValue

これはうまくいくでしょう

Int32.TryParse("123", out bob.AnotherValue);

ただし、一般的なガイドラインでは、クラスフィールドを公開しないように指示されています。したがって、一時変数アプローチを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.