null演算子
はじめに
プログラミングにおいてnullは避けて通れない存在である。特に、オブジェクトや変数が未定義であることによって生じるバグは、開発の現場で非常に多く発生する。
そのため、C#や TypeScript では、null を安全に扱うための演算子や型の仕組みが用意されている。
この記事では、以下の null 関連機能について、C#と TypeScript の両方で解説する。
null 合体演算子(??)
null 合体演算子(??) は、左辺の値が null または undefined の場合に、右辺の値を返す演算子である。null や未定義値に対するフォールバック(代替値)を簡潔に記述できる。
使用例
C#
string? name = null;
// nameがnullなら"ゲスト"が代入される
string displayName = name ?? "ゲスト";
TypeScript
const name: string | null = null;
// nameがnullまたはundefinedなら"ゲスト"
const displayName = name ?? "ゲスト";
null 合体代入演算子(??=)
null 合体代入演算子(??=) は、変数が null または undefined の場合に、右辺の値を代入する演算子である。値が未設定のときだけ初期化したい場合に便利である。
使用例
C#
string? name = null;
name ??= "ゲスト";
TypeScript
const name: string | null = null;
// nameがnullなので"ゲスト"が代入される
name ??= "ゲスト";
null 条件演算子(?.)
null 条件演算子(?.) は、オブジェクトが null や undefined でなければ プロパティやメソッドにアクセスし、そうでなければ undefined(C#では null)を返す 演算子である。null 参照例外を避けるために使われる。
使用例
C#
Person? person = null;
// personがnullなので、nameもnull
string? name = person?.Name;
TypeScript
const person: Person | null = null;
// personがnullなので、nameはundefined
const name = person?.name;
null 条件インデクサ(?[])
配列や辞書、連想配列などの インデクサ([]を使ったアクセス) に対して、null チェック を安全に行うための演算子
使用例
C#
Dictionary<string, string>? dict = null;
// dictがnullならvalueもnull
string? value = dict?["key"];
TypeScript
const dict: { [key: string]: string } | null = null;
// dictがnullなのでvalueはundefined
const value = dict?.["key"];
null 許容抑制演算子(!)
null 許容抑制演算子(!) は、開発者が この変数は null ではない と明示的に断言するための演算子である。型チェック上は null の可能性があっても、強制的に non-null として扱う。
使用例
C#
string? name = null;
// コンパイル時はOK、実行時にnullだと例外
Console.WriteLine(name!);
TypeScript
let name: string | null = null;
// TypeScript上ではnon-null扱いされる
console.log(name!);
null チェック(if 文/型ガード)
null チェックは、変数の値が null かどうかを明示的に確認する方法である。C#と TypeScript どちらでも、通常の if 文で null を判定し、その中で安全に処理を行うことができる。nullでない場合は null 許容抑制演算子を使用し null 出ないことを示すと良い。
使用例
C#
if (name != null)
{
// null 許容抑制演算子を使用しnull出ないことを示す
Console.WriteLine(name!.Value.Length);
}
TypeScript
if (name !== null) {
// null 許容抑制演算子を使用しnull出ないことを示す
console.log(name!.length);
}
null 許容型(nullable types)
null 許容型とは、変数が null の値を持つ可能性がある型 のことを指す。C#では?、TypeScript では| nullを使って明示的に表現する。
使用例
C#
string? name = null;
int? age = null;
TypeScript
let name: string | null = null;
let age: number | null = null;
まとめ
C#と TypeScript の両言語では、null 安全性を高めるための機能が豊富に用意されている。文法こそ似ているためわかりずらいが、一つ一つに意味があるので少しづつ覚えていくと良いだろう。注意点として、無闇矢鱈に使用するとバグの元になりかねないため、しっかりと理解した上で使用することをおすすめする。
Discussion