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

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

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

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

### if文(「if else」「else」の省略)
「if else」「else」は不要なら省略が可能です。

```csharp
if (isRunning)
{
    // 処理
}
```

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

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

### if文(「改行」を省略)
処理が極端に短い場合は、さらに改行も省略して1行で書いても大丈夫です。

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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



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

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

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

### 例
if文で書いた例

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

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

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

## null合体割り当て演算子(??=)
C# 8.0 以降
nullの場合の初期値を代入するようなときに便利です。

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

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

### 例
if文で書いた例

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

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

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

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

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

## null条件演算子(?.)
C# 6 以降
こちらもnullチェックで使える書き方です。nullだった場合はnullを返すだけでいい場合に使えます。

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

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

### 例
if文で書いた例

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

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

```csharp
NameTextField.Text = User?.Name;
```

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

```csharp
 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
```