web-dev-qa-db-ja.com

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

私が持っていると仮定します:

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

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

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

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

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

自動実装プロパティではなく、フィールドと「通常」プロパティを明示的に使用する必要があります。

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

次に、出力パラメータとしてfieldを渡すことができます。

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

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

プロパティではこれができません。 VBでcanプロパティを参照渡しするか、出力パラメータとして使用する場合でも、基本的に余分な一時変数があります。

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

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

次に使用します:

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

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

79
Jon Skeet

これは達成できますが、プロパティを使用することはできません。

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

    public int AnotherValue; // This is a field
}

outではValueを使用できませんが、AnotherValueでは使用できます。

これは動作します

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

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