「変数の内容がnullだったら、×××」というのは、プログラミングでは頻繁に必要となる処理だが、C#では「null合体演算子」(null coalescing operator、coalesceは「合体する」という意味の動詞)を使うと、そのような処理を簡潔に記述できる場合がある。
例えば次のコードは、何らかの処理を行った後、変数descriptionの内容がnullだったら、とりあえず変数titleの内容をコピーしておくという処理だ。
using System;
class Program {
static void Main() {
string title = "今日の出来事";
string description = null;
// ……何らかの処理……
if (description == null) {
description = title;
}
Console.WriteLine(description); // 出力:タイトル
}
}
このコード内のif文は、null合体演算子を使えば、次のように簡潔に記述できる。null合体演算子は、クエスチョン・マーク(はてなマーク)を2つ並べて「??」と記述する
using System;
class Program {
static void Main() {
string title = "タイトル";
string description = null;
// ……何らかの処理……
// if (description == null) {
// description = title;
// }
// と↓は同じ
description = description ?? title; // 「??」はnull合体演算子
Console.WriteLine(description); // 出力:タイトル
}
}
「description ?? title」は、変数descriptionがnullであれば変数titleを返し、nullでなければ変数descriptionを返す。
別の例を見てみよう。
次のコードのSampleクラスのTitleBitmapプロパティは、特定のビットマップを返すプロパティだが、メモリを効率的に利用するために、プロパティにアクセスされたときに初めてビットマップを読み込む。これは遅延ロードと呼ばれるパターンの一種だ。
using System.Drawing;
public class Sample {
Bitmap myBitmap = null;
// TitleBitmapプロパティ
public Bitmap TitleBitmap {
get {
// 必要になったときに初めて画像を読み込む
return myBitmap ?? (myBitmap = new Bitmap("title.jpg"));(1)
}
}
}
class Program {
static void Main() {
Sample s = new Sample();
Bitmap bitmap = s.TitleBitmap;
}
}
(1)では、変数myBitmapがnullであれば画像を読み込み、それをmyBitmapに代入する(さらにその値がプロパティの戻り値となる)。myBitmapがnullでなければ、すでに画像は読み込み済みなので、単にそれを返すだけだ。
利用可能バージョン:.NET Framework 2.0以降
カテゴリ:C# 処理対象:演算子
Copyright© Digital Advantage Corp. All Rights Reserved.