?: 演算子は、if-then-else 構造の拡張です。
拡張は then ブロックと else ブロックにあります。then-block と else-block が if-then-else コンストラクトに対して void を返す場合、?: 演算子の型を返す必要があります。?: 演算子の型に対する追加の制約は、2 つの型が同一でなければならないということです。この制約は、2 つの型を同一にするためにコンパイラによって自動キャストが使用されるという事実によって少し緩和されます。
?: 演算子を使用したコードは、一般に短くなりますが、読みにくくなります。これは、if-then-else コンストラクトを ?: 演算子に置き換える際に考慮すべき 1 つのポイントです。then-block と else-block が 1 つのライナーでない限り、それを ?: 演算子に置き換える価値はほとんどありません。
if-then 構文は、if-then-else 構文の限定バージョンです (またはその逆、if-then-else 構文は if-then 構文の拡張です)。if-then 構造には then ブロックという 1 つのコード ブロックしかないため、if-then 構造を ?: 演算子に置き換えることはできません。最初に、if-then コンストラクトを空の else ブロックで拡張する必要があります。
例:
// initialising an integer with an if-then construct.
int x = 0;
if (some_condition)
{
x = 1;
}
これは、then ブロックが整数を返すかのように考えてください。?: 演算子を直接使用することはできません。
// initialising an integer with an if-then-else construct.
int y;
if (some_condition)
{
y = 1;
}
else
{
y = 0;
}
if-then コンストラクトを if-then-else コンストラクトに拡張し、then-block と else-block を整数を返すと考えて、タイプが一致するようにします ;-) 互いに一致します。この場合、?: 演算子を使用できます。
// initialising an integer with a ?: operator.
int z = (some_condition) ? 1 : 0;
コードについて:
var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
directory.Create();
}
この場合、then-block が値を返すようにする賢明な方法がわかりません。その結果、?: 演算子の使用が不可能になるか、非常に複雑になり、醜いコードになります。私のアドバイスは、この場合は if-then 構造に固執することです。