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

Chapter5 null許容型

川俣 晶
2009/09/28

5.7 nullを許容するとパフォーマンスに影響するか?

 null許容型を使用すると、パフォーマンスに差が出るだろうか?

 まず、必然的にメモリ使用量が増えることを確認しておこう。nullであるか否かという情報を記憶する分だけ、メモリを余計に消費せざるをえないのである。

 では速度面ではどうだろうか? 簡単な比較プログラムを作成してみた(リスト5.10参照)。

using System;

class Program
{
  static void Main(string[] args)
  {
    int sum1 = 0;
    DateTime start1 = DateTime.Now;

    for (int i = 0; i < int.MaxValue; i++)
    {
      sum1 += i;
    }
    Console.WriteLine(DateTime.Now - start1);

    int? sum2 = 0;
    DateTime start2 = DateTime.Now;

    for (int i = 0; i < int.MaxValue; i++)
    {
      sum2 += i;
    }
    Console.WriteLine(DateTime.Now - start2);
  }
}
リスト5.10 null非許容型とnull許容型の速度比較

00:00:01.0430000
00:01:43.9360000
リスト5.10の実行結果例

 見てのとおり、桁が1つも違う結果になった。

 つまり、null許容型とは、相当の性能低下を許したうえでなければ使用できない型ということになる。したがって、本当にnullを許容する価値がある場合にのみ使用すべきだろう。nullになることが絶対にありえない変数の型に使うべきではない。

【C#olumn】null許容への批判

 一応、補足的に付け加えておこう。

 値型であってもnullが使えるようになることは、必ずしも全面的に肯定できるものではない。なぜかといえば、nullを使うべきではない……という主張も実際に存在するためである。

 最も典型的なものは、リファクタリングカタログに存在する「nullオブジェクトの導入」だろう。これは、null値が存在することによってnullのケースの処理を行うためのコードが肥大化し、バグが入り込みやすくなるという問題への処方箋となるものである。

 この場合、変数や引数にnullを代入する代わりに、何もしないオブジェクトである「nullオブジェクト」を代入する。nullオブジェクトをうまく活用すると、ソースがより簡潔になり、バグも出にくくなる。このようなメリットを享受していると、nullの利用を拡大することに抵抗感が出る可能性がありうる。

 また、RDBの世界にも、次のようにNULLを使うべきではないと主張する意見がある。

NULL撲滅委員会
http://www.geocities.jp/mickindex/database/db_getout_null.html

 このような批判に加え、速度が圧倒的に遅いという状況を加味すれば、null許容型は素直に喜んで受け入れられるものではないだろう。

 しかし、NULLを含むRDBのデータを処理するプログラムを簡潔に記述する……ということになれば、話は変わる。データベースに格納された値をストレートに受け止められる変数を宣言できれば、それはソースコードが簡潔になることを意味する。それは大いにメリットのあることだろう。成果を享受するか、トラブルを抱き込むかは、使いどころの見極め次第、ということである。

【Exercise】練習問題

 C#において、intは値型である。値型は通常nullという値になることがない。nullは参照型が取ることのできる値である。では、nullが許容されたintであるint?は値型か、参照型か? 正しいものを選べ。

  1. 単なるシンプルな値型である
  2. 単なるシンプルな参照型である
  3. 入れる値によって値型になったり参照型になったりする
  4. 参照型であり、intの値を格納する場合は内部でボックス化される
  5. 値型であり、nullの値を格納する場合は数値の0を格納してnullを示す

 ◎解答:「 1 」(この行をマウスで選択してください)End of Article


 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 記事ランキング

本日 月間