連載:[完全版]究極のC#プログラミング

Chapter5 null許容型

川俣 晶
2009/09/28

5.4 null合体演算子

 null許容型を使い始めると、どうしても「nullでない場合には」という条件判定を書く機会が増えてしまう。

 それをすべてif文で書いていては、コードが膨らんできりがない(リスト5.4参照)。

using System;

class Program
{
  static void Main(string[] args)
  {
    int? a = 123;

    if (a != null)
    {
      Console.WriteLine("Route {0}", a * 2);
    }
    else
    {
      Console.WriteLine("Route 0");
    }
    // 出力:Route 246
  }
}
リスト5.4 コードが伸びがちなif文による判定

 そこで、条件演算子を活用してコードをコンパクトに書きたくなる(リスト5.5参照)。

using System;

class Program
{
  static void Main(string[] args)
  {
    int? a = 123;

    Console.WriteLine(a != null ? a * 2 : 0); // 条件演算子の利用
    // 出力:246
  }
}
リスト5.5 条件演算子によるソースの短縮

 だが、「a != null ? a * 2 : 0」という式は冗長でわかりにくい。aは2回も出てくるし、本当に得たい値を計算する式「a * 2」よりも、条件式「a != null」のほうが長い。毎回毎回、「!= null」を書くと思うと、うんざりしてくるだろう。

 そこで、C# 3.0ではスペシャルな贈り物が用意されている。それが、「null合体演算子」である。これを使うと、リスト5.6のように式をさらに短くできる。

using System;

class Program
{
  static void Main(string[] args)
  {
    int? a = 123;

    Console.WriteLine("Route {0}", a * 2 ?? 0);
    // 出力:Route 246
  }
}
リスト5.6 null合体演算子(??演算子)によるコードの簡潔化

 このnull合体演算子は、「??」と表記するが、「&&」や「||」のような演算子と効能が似ている。つまり、前の式の値次第で、後の式を評価しないのである。

 具体的にいえば、「式1 ?? 式2」と書いたとき、これは次のような値となる。

  • 式1の値がnullではないとき → 式1の値(式2は評価されない)
  • 式1の値がnullのとき → 式2の値

 つまり、「??」と書くだけで、いとも簡単にnullだった場合に補う値を記述できるわけである。これがあるとないとでは、null許容型の使い勝手が歴然と違ってくるだろう。

 それだけではない。

 null合体演算子は参照型にも使用可能なのである。たとえば、リスト5.7はstring型に対して使用した例である。

using System;

class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine(Console.ReadLine() ?? "EOF");
  }
}
リスト5.7 参照型でのnull合体演算子の利用

 このプログラムを実行し、何か1行入力して[Enter]キーを押した場合、Console.ReadLineメソッドは文字列オブジェクトを返す。それはnullではないので、そのままConsole.WriteLineメソッドの引数になり、画面に出力される。

 一方、[Ctrl]+[Z]キーを押して[Enter]キーを押すと、標準入力は入力が終了したEOF(End Of File)状態となる。このとき、Console.ReadLineメソッドはnullを返す。その結果、null合体演算子の2番目の式が評価され、結果として「EOF」という文字列が式の値となり、これが出力される。

 余談だが、C系の言語では、条件演算子を“宗教”的に嫌うプログラマーも多い。はたして、null合体演算子も拒絶されるのだろうか? 少し興味のある問題である。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter5 null許容型
    1.5.1 null許容型とは何か?
    2.5.2 なぜnullを入れたいのか?
    3.5.3 null許容型の内部構造
  4.5.4 null合体演算子
    5.5.5 is演算子の挙動に注意
    6.5.6 3値論理型として使用できるbool?型
    7.5.7 nullを許容するとパフォーマンスに影響するか?/null許容への批判/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間