C#でnullチェックを簡潔に行うには?.NET TIPS

» 2010年03月18日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 「変数の内容が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チェックの例

 このコード内の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); // 出力:タイトル
  }
}

null合体演算子「??」の利用例(1)

 「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;
  }
}

null合体演算子「??」の利用例(2)
変数myBitmapがnullであれば、画像を読み込む。

 (1)では、変数myBitmapがnullであれば画像を読み込み、それをmyBitmapに代入する(さらにその値がプロパティの戻り値となる)。myBitmapがnullでなければ、すでに画像は読み込み済みなので、単にそれを返すだけだ。

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:C# 処理対象:演算子


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。