あなたがこれを行うことができることを(バグを発見して)知りました:
string s = "3";
int i;
int.TryParse(s = "hello", out i); //returns false
割り当ての戻り値を使用する正当な用途はありますか?
(当たり前i++
ですが、これも同じですか?)
あなたがこれを行うことができることを(バグを発見して)知りました:
string s = "3";
int i;
int.TryParse(s = "hello", out i); //returns false
割り当ての戻り値を使用する正当な用途はありますか?
(当たり前i++
ですが、これも同じですか?)
一般的に、代入の戻り値を使用することは避けます。バグを見つける必要がありすぎる可能性があるからです。ただし、うまくいけば以下に示すように、この機能には 1 つの優れた使用法があります。遅延初期化です。
class SomeClass
{
private string _value;
public string Value { get { return _value ?? (_value = "hello"); } }
}
=>
C# 6 以降、これは次の表記法を使用して表現できます。
class SomeClass
{
private string _value;
public string Value => _value ?? (_value = "hello");
}
??を使用して 記法と割り当てからの戻り値、簡潔でありながら読みやすい構文は、フィールドを初期化し、そのプロパティが呼び出されたときにプロパティを介して返すためにのみ使用できます。上記の例では、これはあまり役に立ちませんが、ユニット テストが必要なファサードなどでは、テスト対象の部分を初期化するだけで、コードを大幅に簡素化できます。
割り当ては、他のものと同じように式です。これは有効な構文です。
同じ理由で、これは有効です:
int i;
int j;
int k;
i = j = k = 42;
割り当ての戻り値を使用する正当な用途はありますか?
はい。
代入演算子 (=) は、右側のオペランドの値を、左側のオペランドが示す格納場所、プロパティ、またはインデクサーに格納し、その値を結果として返します。
つまり=
、代入のみを行うのではなく、値を式として返します。メソッド内で、参照が文字列s
を指しなくなりました.."hello"
"3"
そう、
int.TryParse(s = "hello", out i);
のように評価されます。
int.TryParse("hello", out i);
"hello"
は有効な整数ではないため、 を返しますfalse
。
あなたは基本的に尋ねています:
変数への代入を値として使用できると便利ですか?
便利な場所の 1 つは、変数の代入をデイジー チェーン接続する場合です。
string a, b, c;
a = b = c = "hello";
括弧で囲むとどちらがより明確になります:
string a, b, c;
a = (b = (c = "hello"));
値c = "hello"
がなかった場合hello
、上記は不可能です。他の場所での使用は限られていますが、実際の欠点はありません。