• システム開発に関わる内容をざっくりと書いていく

C#の”?”の使い方

C#の”?”(クエスチョンマーク)は、主にnull許容型や条件演算子に使用され、コードの安全性や可読性を向上させる。ここでは、”?”がどのように使われるかを具体例とともに解説する。


1. null許容型(Nullable Types)

“?”は、値型変数がnull値を持てるようにするために使用される。通常の値型(intboolなど)はnullを許容しないが、int?bool?のように”?”を付けると、nullを許容できるようになる。

例:

csharp
int? age = null; // nullを許容するint型
if (age.HasValue)
{
Console.WriteLine($"Age: {age.Value}");
}
else
{
Console.WriteLine("Age is unknown");
}

この場合、ageがnullの場合にはHasValueがfalseを返し、nullでない場合にはage.Valueを使って値にアクセスできる。


2. null条件演算子(Null-Conditional Operator)

null条件演算子?.は、オブジェクトがnullかどうかを確認しつつ、メンバーやメソッドにアクセスするために使われる。オブジェクトがnullであれば、nullが返され、nullでなければ指定のメンバーやメソッドにアクセスする。

例:

csharp
Person? person = GetPerson();
int? length = person?.Name?.Length; // personがnullでない場合、NameのLengthを取得
Console.WriteLine(length ?? 0); // lengthがnullの場合は0を表示

このコードでは、personperson.Nameがnullの場合、null条件演算子によりエラーを避けつつ安全にアクセスしている。


3. null合体演算子(Null-Coalescing Operator)

null合体演算子??は、変数がnullの場合に代替値を提供するために使われる。nullでなければ変数の値を、nullであれば指定したデフォルト値を返す。

例:

csharp
string? name = GetName();
string displayName = name ?? "Unknown"; // nameがnullの場合、"Unknown"を使用
Console.WriteLine(displayName);

この例では、nameがnullであればdisplayNameに”Unknown”が代入され、nullでなければnameの値が代入される。


4. null合体代入演算子(Null-Coalescing Assignment Operator)

C# 8.0で導入された??=演算子は、変数がnullの場合にだけ代入を行う演算子。変数がnullでない場合はそのままの値を保持する。

例:

csharp
string? title = null;
title ??= "Default Title"; // titleがnullなら"Default Title"を代入
Console.WriteLine(title); // 出力: Default Title

このコードでは、titleがnullのときだけ”Default Title”が代入され、nullでない場合は既存の値が維持される。


5. 条件演算子(三項演算子)

条件演算子?:は、条件式がtrueかfalseかに応じて異なる値を返す三項演算子。短い条件分岐で使われ、コードをシンプルにする。

例:

csharp
int age = 20;
string category = (age >= 18) ? "Adult" : "Minor"; // ageが18以上なら"Adult"、それ以外は"Minor"
Console.WriteLine(category);

この場合、ageが18以上であればcategoryには”Adult”が、そうでなければ”Minor”が代入される。


まとめ

C#の”?”は、null許容型の指定やnull条件演算子、null合体演算子など、nullにまつわる操作を簡潔に記述するための強力なツール。また、条件演算子としても使われ、コードの簡略化と可読性向上に役立つ。これらを適切に活用することで、安全で簡潔なC#コードが書けるようになる。