49
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# その2 Advent Calendar 2019

Day 21

C#での条件分岐の書き方、省略した書き方、nullチェックの書き方のまとめ

Last updated at Posted at 2019-12-21

C#初心者の方の参考になれば幸いです。

if文

if文(基本形)

基本形。
条件文の結果により処理を分岐させます。

if (this.Age <= 6)
{
    message = "6歳以下です。";
}
else if (this.Age <= 12)
{
    message = "12歳以下です。";
}
else
{
    message = "12歳を超えています。";
}

if文(「if else」「else」の省略)

「if else」「else」は不要なら省略が可能です。

if (isRunning)
{
    // 処理
}

if文(「{ }」を省略)

処理が1行だけの場合「{}」を省略できます。

if (Age <= 6)
    message = "6歳以下です。";
else if (Age <= 12)
    message = "12歳以下です。";
else
    message = "12歳を超えています。";

if文(「改行」を省略)

処理が極端に短い場合は、さらに改行も省略して1行で書いても大丈夫です。

if (Age <= 6) message = "6歳以下です。";
else if (Age <= 12) message = "12歳以下です。";
else message = "12歳を超えています。";

三項演算子(?:)

三項演算子(または条件演算子とも呼ばれます)も短い分岐処理に便利な構文です。

構文

条件文 ? trueの場合の処理 : falseの場合の処理

記述内容が短い例

短くて単純な条件判定に便利。
if文で書くと複数行かかるものが1行にできたりして、コードの見通しが良くなる場合に使えます。

以下はif文で書いた場合です。

var message = "";
if (isRunning) 
{
    message = "実行中です";
} 
else 
{
    message = "停止中です";
}

上記を三項演算子で書くとスッキリ書けます。

var message = isRunning ? "実行中です" : "停止中です";

ただ、trueまはたfalseを返す場合は条件の部分だけでbool値になるので三項演算子にしないほうがさっぱりすると思います。

// 例1
TextBox.Visivle = (setting.IsUse && setting.Mode == "1") ? true  : false;
// ↓条件の部分だけでbool値になるのでそのまま使える
TextBox.Visivle = (setting.IsUse && setting.Mode == "1");

// 例2
TextBox.ReadOnly =  (setting.IsUse) ? false : true;
// ↓ 条件に合致する場合にfalseを入れたい場合は、bool値を反転させて入れる
TextBox.ReadOnly = !(setting.IsUse);

記述内容が長い例

あまりに長いと見にくくなってしまいますので三項演算子で記述するのは避けたほうがいいですが、改行することである程度見やすく整えることもできます。
長い場合は以下のように改行しインデントを揃えると読みやすくなると思います。

1行で書いた場合、長くなるほどだんだん見づらくなってきますが、

var message = articles.Any() ? articles.Count + "件見つかりました。" : "記事がありません。";

区切りのいいところで改行を入れると見やすく書けます。
C#は文末に必ず「;」が必要なため、改行を途中で入れても大丈夫です。

var message = articles.Any() 
              ? articles.Count + "件見つかりました。" 
              : "記事がありません。";

null合体演算子(??)

nullチェックでnullの場合の初期値を代入するようなときにスッキリ書ける構文です。三項演算子と同様に判定後の処理がシンプルな場合に便利です。

構文

nullチェックする値がnullでなければその値を返し、nullの場合は??の右側に指定した値を返します。

nullチェックする値 ?? nullの場合の値

if文で書いた例

if (TelTextField.Text == null) 
{
    User.Tel = "";
} 
else 
{
    User.Tel = TelTextField.Text;
}

上記をnull合体演算子(??)で書いた例

User.Tel = TelTextField.Text ?? "";

null合体割り当て演算子(??=)

C# 8.0 以降
nullの場合の初期値を代入するようなときに便利です。

構文

nullチェックする値がnullでなければその値を返し、nullの場合は??=の左側(nullチェックする値)に右側に指定した値を代入します。

nullチェックする値 ??= nullの場合に代入する値

if文で書いた例

if (list == null)
{
    list = new List<int>();
}

上記をnull合体割り当て演算子(??=)で書いた例(C# 8.0以降)

list ??= new List<int>();

シングルトンインスタンスの生成をnull合体割り当て演算子(??=)で書いた例

public static AppSettings Instance
    => instance ??= new AppSettings();

null条件演算子(?.)

C# 6 以降
こちらもnullチェックで使える書き方です。nullだった場合はnullを返すだけでいい場合に使えます。

構文

値がnullでない場合にのみ、メンバー(プロパティやメソッドなど)にアクセスできます。nullだった場合はnullを返します。

nullチェックする値?.メンバー
nullチェックする値?[インデックス番号]

if文で書いた例

if (User == null) 
{
	NameTextField.Text = null;
} 
else 
{
	NameTextField.Text = User.Name;
}

null条件演算子(?.)で書いた例(C# 6.0以降)

NameTextField.Text = User?.Name;

イベントの呼び出しの例。イベントを呼び出す前に通常nullチェックが必要ですが、楽に書けるようになります。

 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
49
47
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?