単純な条件分岐と if 文
プログラミングでは、「もしAという条件が満たされていればBという値を、そうでなければCという値を採用する」という場面が非常に多くあります。
例えば、ユーザーのステータス(bool値)に応じて表示用の文字列(”有効” または “無効”)を決定する場合、if-else構文を使うと以下のように記述できます。
bool isActive = true;
string statusText;
if (isActive == true)
{
statusText = "ステータス: 有効";
}
else
{
statusText = "ステータス: 無効";
}
// statusText は "ステータス: 有効" になる
この処理は数行を必要としますが、C#にはこのような単純な二択の代入を1行で記述できる「条件演算子」が用意されています。
条件演算子(?:)とは
条件演算子は、3つの部分(オペランド)から構成されるため、「三項演算子」とも呼ばれます。C#において唯一の三項演算子です。
構文は非常にシンプルです。
条件式 ? 真の場合の値 : 偽の場合の値
動作:
- まず
条件式が評価されます。 条件式がtrueだった場合、:(コロン)の左側(真の場合の値)が式全体の結果として返されます。条件式がfalseだった場合、:(コロン)の右側(偽の場合の値)が式全体の結果として返されます。
条件演算子の基本的な使用例
先ほどのif-else文の例を、条件演算子(?:)を使って書き換えると、以下のようになります。
例1: 変数への代入
if-else構文で数行かかっていた処理が、変数の宣言と初期化を含めて1行で完結し、非常に簡潔になります。
using System;
public class ConditionalOperatorExample
{
public static void Main()
{
bool isActive = false;
// 条件演算子(?:)を使用して statusText に値を代入
string statusText = isActive ? "ステータス: 有効" : "ステータス: 無効";
Console.WriteLine(statusText);
}
}
出力結果:
ステータス: 無効
例2: 在庫状況の判定
数値の比較結果に応じて異なる文字列を割り当てる際にも便利です。
using System;
public class StockCheckExample
{
public static void Main()
{
int stockCount = 0; // 現在の在庫数
// 在庫が0より大きいか(在庫があるか)を判定
string displayMessage = (stockCount > 0) ? "在庫あり" : "在庫切れ";
Console.WriteLine($"商品の状態: {displayMessage}");
}
}
出力結果:
商品の状態: 在庫切れ
応用: 文字列補間や引数での利用
条件演算子は「値を返す式」であるため、変数の代入だけでなく、メソッドの引数や文字列補間($)の{}内部など、値が必要とされる場所ならどこでも使用できます。
using System;
public class AdvancedUsageExample
{
public static void Main()
{
int userAge = 19;
// 1. メソッドの引数として使用
bool canDrinkAlcohol = (userAge >= 20) ? true : false;
ProcessUserRights(canDrinkAlcohol);
// 2. 文字列補間の内部で直接使用
string feeTypeMessage = $"適用料金: {(userAge >= 20 ? "大人料金" : "子供料金")}";
Console.WriteLine(feeTypeMessage);
}
// 権限処理(ダミー)
public static void ProcessUserRights(bool canDrink)
{
if (canDrink)
{
Console.WriteLine("アルコール飲料の購入が許可されました。");
}
else
.WriteLine("未成年者のため、アルコール飲料は購入できません。");
}
}
}
出力結果:
未成年者のため、アルコール飲料は購入できません。
適用料金: 子供料金
使用上の注意点
条件演算子はコードを簡潔にしますが、過度な使用は可読性を著しく低下させる危険性があります。
避けるべき例(ネスト/入れ子):
// 非推奨:条件演算子のネストは非常に読みにくい
int score = 75;
string grade = (score >= 90) ? "A" :
(score >= 70) ? "B" : "C";
上記のような複雑な分岐(3つ以上の分岐)を行う場合は、if-else if-else構文やswitch式(C# 8.0以降)を使用した方が、コードの意図が明確になり、保守性が高まります。
まとめ
条件演算子(?:)は、**「条件がAならばB、さもなくばC」**という単純な二者択一のロジックで値を決定する際に非常に有効な構文です。
変数の初期化や文字列補間などで利用することで、if-else文よりもはるかにコードを簡潔にできます。ただし、ロジックが複雑になる場合は、可読性を優先してif-else文などを使用することが賢明です。
