C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でnull値を扱うための演算子とは???・??=・?.の使い方を解説

C#には、null値を安全かつ簡潔に処理するための演算子として、主に次の3つが用意されています。

  • null合体演算子(??)
  • null合体代入演算子(??=)
  • null条件演算子(?.)

1. null合体演算子(??)

null合体演算子(??)は、左辺の変数がnullでない場合はその値をそのまま返し、nullの場合は右辺に指定したデフォルト値を返す演算子です。冗長な条件分岐や三項演算子を置き換えることで、コードを大幅にすっきりさせられます。

この演算子を使うと、従来は次のように書いていた式を…

string resultOne = value != null ? value : "default_value";

次のようにシンプルに表現できます。

string resultTwo = value ?? "default_value";

例:

using System;
class Program{
   static void Main(){
      string input = null;
      string choice = input ?? "default_choice";
      Console.WriteLine(choice); // default_choice
      string finalChoice = choice ?? "not_chosen";
      Console.WriteLine(finalChoice); // default_choice
   }
}

2. null合体代入演算子(??=)

null合体代入演算子(??=)は、左辺の値がnullでない場合はその値をそのまま返し、nullである場合にのみ右辺の値を代入します。つまり、「現在の値がnullならデフォルト値で初期化する」という処理を1行で書ける演算子です。なお、この演算子はC# 8.0以降で利用できます。

従来は次のようなif文で書いていた処理を…

if (result == null)
   result = "default_value";

次のように簡潔に書き換えられます。

result ??= "default_value";

この演算子は、遅延評価(Lazy Initialization)を行うプロパティと組み合わせると特に有用です。負荷の高い計算結果を実際に必要になるまで生成せず、一度計算したらキャッシュしておく、といった場面で活躍します。

例:

class Tax{
   private Report _lengthyReport;
   public Report LengthyReport => _lengthyReport ??= CalculateLengthyReport();
   private Report CalculateLengthyReport(){
      return new Report();
   }
}

3. null条件演算子(?.)

null条件演算子(?.)は、インスタンスのメソッドやプロパティへ安全にアクセスするための演算子です。対象のインスタンスがnullの場合にはNullReferenceExceptionをスローせずにnullを返し、nullでない場合には通常どおりメンバーへアクセスします。

従来は次のような三項演算子で書いていた式を…

string result = instance == null ? null : instance.Method();

次のように短く書けます。

string result = instance?.Method();

例:

using System;
string input = null;
string result = input?.ToString();
Console.WriteLine(result); // 何も出力されない(null)

まとめ:すべての演算子を組み合わせた例

using System;
class Program{
   static void Main(){
      string input = null;
      string choice = input ?? "default_choice";
      Console.WriteLine(choice); // default_choice
      string finalChoice = choice ?? "not_chosen";
      Console.WriteLine(finalChoice); // default_choice
      string foo = null;
      string answer = foo?.ToString();
      Console.WriteLine(answer); // 何も出力されない(null)
   }
}

出力

default_choice
default_choice
  1. PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方

    本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1) MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用

  2. ヒットマン詐欺とは?その手口と正しい対処法を徹底解説

    「ヒットマン詐欺」は、インターネット上で金銭を恐喝する手法としては最も古いものの一つです。しかし、他の詐欺と決定的に異なる点が一つあります。それは、被害者の命が狙われていると主張してくるという、その重大性です。一見すると迷惑メールの一種にすぎないように思えますが、この特異な性質ゆえに、適切に対処できる人はごくわずかです。本記事では、ヒットマン詐欺の手口、なぜこれほど効果的なのか、そして私たちが取るべき対応について詳しく解説します。 ヒットマン詐欺とは? ある日、受信箱を確認すると、「あなたの知り合いから、あなたを『始末』するよう依頼された」と名乗る人物からのメールが届いたと想像してみてくださ