たとえば、次のコードがある場合:
if (foo != default(foo))
{
int foo2 = foo;
}
これを割り当てだけに短縮する方法はありますか? 疑似コードでは、次のようなものです: foo2 = デフォルトの foo でない場合
たとえば、次のコードがある場合:
if (foo != default(foo))
{
int foo2 = foo;
}
これを割り当てだけに短縮する方法はありますか? 疑似コードでは、次のようなものです: foo2 = デフォルトの foo でない場合
これを短縮しようとする際の問題はfoo2
、if ステートメント内のスコープ内でのみ有効であることです。これを 1 行に移動すると、常にfoo2
外側のスコープで定義する必要があり、常に何らかの値が必要になります。
それが許容できる場合は、C# の条件演算子を使用できます。
int foo2 = foo != default(foo) ? foo : default(int);
foo == default(foo)
最終部分となるwhen にも何かが必要であることに注意してください。int 値では、おそらく: 0;
最後に使用しますが、 に対してチェックしてdefault(foo)
いるので、「実際のユースケース」はおそらくInt32
値ではないと想定しています...
編集:
(int) は後付けでした。実際に試してみたところ、既に foo2 が割り当てられていたので、これはまさに私が探していたものです。
このコメントがあれば、次のことができます。
foo2 = foo != default(foo) ? foo : foo2;
これは、デフォルト値がないfoo2
場合は効果的に再割り当てし、ある場合foo
はそのままにしておきます (それ自体に割り当てます)。
そうは言っても、私は個人的にあなたのオリジナルに似たものを好みます:
// Assumes foo2 is already defined, based on your comment
if (foo != default(foo))
foo2 = foo;
私の意見では、これはあなたの意図の点ではるかに明確であり、条件演算子で得られる余分な割り当てを回避します。
次のようなこともできます。
foo2 = foo != default(foo) ? foo : foo2;
// either
int foo2 = (foo != default(foo)) ? foo : default(int);
// or
int? foo2 = (foo != default(foo)) ? foo : null;
これ以上単純化することはできません。値を宣言するのではなく (スコープ ブロックでも) 値を設定するだけの場合は、foo2
それをメソッドにリファクタリングしてわずかな利益を得ることができます。