連載:[完全版]究極のC#プログラミングChapter5 null許容型川俣 晶2009/09/28 |
|
|
5.4 null合体演算子
null許容型を使い始めると、どうしても「nullでない場合には」という条件判定を書く機会が増えてしまう。
それをすべてif文で書いていては、コードが膨らんできりがない(リスト5.4参照)。
| |
リスト5.4 コードが伸びがちなif文による判定 |
そこで、条件演算子を活用してコードをコンパクトに書きたくなる(リスト5.5参照)。
| |
リスト5.5 条件演算子によるソースの短縮 |
だが、「a != null ? a * 2 : 0」という式は冗長でわかりにくい。aは2回も出てくるし、本当に得たい値を計算する式「a * 2」よりも、条件式「a != null」のほうが長い。毎回毎回、「!= null」を書くと思うと、うんざりしてくるだろう。
そこで、C# 3.0ではスペシャルな贈り物が用意されている。それが、「null合体演算子」である。これを使うと、リスト5.6のように式をさらに短くできる。
| |
リスト5.6 null合体演算子(??演算子)によるコードの簡潔化 |
このnull合体演算子は、「??」と表記するが、「&&」や「||」のような演算子と効能が似ている。つまり、前の式の値次第で、後の式を評価しないのである。
具体的にいえば、「式1 ?? 式2」と書いたとき、これは次のような値となる。
- 式1の値がnullではないとき → 式1の値(式2は評価されない)
- 式1の値がnullのとき → 式2の値
つまり、「??」と書くだけで、いとも簡単にnullだった場合に補う値を記述できるわけである。これがあるとないとでは、null許容型の使い勝手が歴然と違ってくるだろう。
それだけではない。
null合体演算子は参照型にも使用可能なのである。たとえば、リスト5.7はstring型に対して使用した例である。
| |
リスト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#プログラミング」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|