【C#】知っておきたい簡略化テクニック12選

## はじめに
C#での一般的な処理について、従来の書き方と簡潔な書き方を比較しながら紹介します。

## 1. 条件による値の設定

### 従来の書き方
```csharp
if (hasDetailView)
{
    this.Width = 627;
}
else
{
    this.Width = 527;
}
```

### 簡潔な書き方（三項演算子）
```csharp
this.Width = hasDetailView ? 627 : 527;
```

## 2. nullチェックと値の代入

### 従来の書き方
```csharp
string name;
if (user.Name != null)
{
    name = user.Name;
}
else
{
    name = "Guest";
}
```

### 簡潔な書き方（null合体演算子）
```csharp
string name = user.Name ?? "Guest";
```

## 3. オブジェクトの階層的なnullチェック

### 従来の書き方

```csharp
string city = null;
if (address != null)
{
    if (address.Prefecture != null)
    {
        if (address.Prefecture.City != null)
        {
            city = address.Prefecture.City;
        }
    }
}

// デフォルト値を設定する場合
if (city == null)
{
    city = "Unknown";
}
```

### 簡潔な書き方（null条件演算子）
```csharp
// 通常の参照
string city = address?.Prefecture?.City;

// デフォルト値を設定する場合
string city = address?.Prefecture?.City ?? "Unknown";
```

## 4. 曜日による処理分岐

### 従来の書き方
```csharp
string GetBusinessHours(DayOfWeek day)
{
    switch (day)
    {
        case DayOfWeek.Saturday:
        case DayOfWeek.Sunday:
            return "10:00-18:00";
        default:
            return "9:00-20:00";
    }
}
```

### 簡潔な書き方（スイッチ式）
```csharp
string GetBusinessHours(DayOfWeek day) => day switch
{
    DayOfWeek.Saturday or DayOfWeek.Sunday => "10:00-18:00",
    _ => "9:00-20:00"
};
```

## 5. リストの初期化と値の追加

### 従来の書き方
```csharp
var products = new List<string>();
products.Add("Product A");
products.Add("Product B");
products.Add("Product C");
```

### 簡潔な書き方（コレクション初期化子）
```csharp
var products = new List<string> { "Product A", "Product B", "Product C" };
```

## 6. メソッドの戻り値の計算

### 従来の書き方
```csharp
public int Add(int a, int b)
{
    return a + b;
}
```

### 簡潔な書き方（ラムダ式）
```csharp
public int Add(int a, int b) => a + b;
```

## 7. 文字列の連結

### 従来の書き方
```csharp
string message = "User: " + user.Name + ", Age: " + user.Age + " years old";
```

### 簡潔な書き方（文字列補間）
```csharp
string message = $"User: {user.Name}, Age: {user.Age} years old";
```

## 8. 複数の戻り値の返却

### 従来の書き方
```csharp
public class CalcResult
{
    public int Sum { get; set; }
    public double Average { get; set; }
}

public CalcResult Calculate(int[] numbers)
{
    return new CalcResult 
    { 
        Sum = numbers.Sum(),
        Average = numbers.Average() 
    };
}
```

### 簡潔な書き方（タプル）
```csharp
public (int Sum, double Average) Calculate(int[] numbers)
    => (numbers.Sum(), numbers.Average());
```

## 9. ファイルの読み込み

### 従来の書き方
```csharp
string content;
using (var reader = new StreamReader("file.txt"))
{
    content = reader.ReadToEnd();
}
```

### 簡潔な書き方（using宣言）
```csharp
using var reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
```

## 10. 型チェックと変換

### 従来の書き方
```csharp
if (obj is string)
{
    string str = (string)obj;
    Console.WriteLine(str.Length);
}
```

### 簡潔な書き方（パターンマッチング）
```csharp
if (obj is string str)
{
    Console.WriteLine(str.Length);
}
```

## 11. 配列の一部取得

### 従来の書き方
```csharp
var subset = array.Skip(2).Take(3).ToArray();
```

### 簡潔な書き方（範囲演算子）
```csharp
var subset = array[2..5];
```

## 12. オブジェクトの初期化

### 従来の書き方
```csharp
var user = new User();
user.Name = "John";
user.Age = 30;
user.Email = "john@example.com";
```

### 簡潔な書き方（オブジェクト初期化子）
```csharp
var user = new User 
{
    Name = "John",
    Age = 30,
    Email = "john@example.com"
};
```

## まとめ

この記事で紹介した簡潔な書き方には、以下のようなメリットがあります。

1. コードの行数が減少
2. 可読性の向上
3. バグの混入リスクの低下
4. メンテナンスの容易さ

:::note alert
ただし、チームの習熟度やプロジェクトの要件に応じて、適切な書き方を選択することが重要です。
:::

## 参考文献
- [C# Documentation](https://docs.microsoft.com/en-us/dotnet/csharp/)
- [C# Programming Guide](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/)
- [?? と ??= 演算子 - null 合体演算子](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-coalescing-operator)