C#のnull条件演算子(?.)とは?null安全なアクセス方法を解説
生徒
「C#で、変数がnullのときにエラーにならないようにアクセスする方法ってありますか?」
先生
「ありますよ。C#では?.というnull条件演算子を使えば、安全にアクセスできます。」
生徒
「null条件演算子ってどうやって使うんですか?」
先生
「それでは、null条件演算子の基本的な使い方を見てみましょう!」
1. null条件演算子(?.)とは?
C#の?.は、「null条件演算子(null-conditional operator)」と呼ばれます。この演算子を使うことで、オブジェクトがnullかどうかを自動でチェックしながら、安全にプロパティやメソッドにアクセスすることができます。
通常、オブジェクトがnullである状態でそのプロパティやメソッドにアクセスしようとすると、NullReferenceException(ヌル参照例外)というエラーが発生します。
しかし、null条件演算子を使えば、そのエラーを回避できるので、プログラムが落ちる心配が少なくなります。
2. null条件演算子の基本的な使い方
次の例では、PersonクラスのNameプロパティにアクセスしています。
class Person
{
public string Name { get; set; }
}
Person person = null;
Console.WriteLine(person?.Name);
このコードでは、personがnullであるため、person.Nameと書いてしまうとエラーになります。
しかし、person?.Nameと書くことで、personがnullかどうかをチェックし、nullでなければNameにアクセスし、nullであればそのままnullを返します。
3. null条件演算子の応用:メソッドの呼び出し
null条件演算子は、プロパティだけでなく、メソッドの呼び出しにも使えます。
class Logger
{
public void Log(string message)
{
Console.WriteLine("ログ: " + message);
}
}
Logger logger = null;
logger?.Log("処理を開始します。");
この例では、loggerがnullであるため、Logメソッドを直接呼ぶとエラーになります。しかしlogger?.Log("...")と書けば、nullかどうかを判断してから実行するため、エラーにならずにスキップされます。
4. null条件演算子の注意点
null条件演算子はとても便利ですが、注意点もあります。例えば、結果がnullになる可能性があるため、値をそのまま使おうとすると別の問題が起きることがあります。
int? length = person?.Name.Length;
この場合、lengthはint?(nullable int型)になり、nullか整数値かのどちらかになります。そのため、length.Valueのようにして取り出す前に、nullチェックをする必要があります。
5. null条件演算子と配列・リストのアクセス
配列やリストにアクセスする時にも、null条件演算子を活用できます。
List<string> words = null;
int? count = words?.Count;
wordsがnullの場合でも、words?.Countと書けばエラーにはならず、countにはnullが入ります。これにより、nullかどうかを先に確認する処理を書く必要がなくなるため、コードがすっきりします。
6. null条件演算子の内部的な動作とは?
裏側では、?.は次のようなif文に書き換えた処理と同じことをしています。
if (person != null)
{
Console.WriteLine(person.Name);
}
このようなコードをいちいち毎回書かなくても、?.を使うだけで同じ動作ができます。可読性(読みやすさ)や保守性(メンテナンスのしやすさ)が向上します。
7. null条件演算子とnull合体演算子の組み合わせ
null条件演算子と一緒によく使われるのが、null合体演算子(??)です。これは、値がnullのときに、代わりのデフォルト値を設定することができます。
string name = person?.Name ?? "未登録";
Console.WriteLine(name);
この例では、person?.Nameがnullだった場合に"未登録"という文字列が代わりに代入されます。