?? 演算子 (null 合体演算子) の意味 - C#

?? 演算子 (null 合体演算子) の意味を紹介します。

概要

新しいC#のコードでは??の演算子がコード中に見られることがあります。以前のC#にはなかった書式のため、わかりにくいこともあります。 この記事では、??演算子、null 合体演算子の意味を紹介します。

書式

(変数または値) ?? (変数または値)

??演算子の左辺の値がnullであった場合、??演算子の右辺の値が返されます。

コードの書き換え

??演算子は次のように書き換えできます。
書き換え元コード
  int? ivalue = value1 ?? value2;
書き換えコード
  int? ivalue;
  if (value1 == null) ivalue = value2; else ivalue = value1;

プログラム例

.NET6 でWindowsFormアプリケーションを作成します。

UI

下図のUIを作成します。フォームにボタンとMultilineプロパティをtrueに設定した複数行のテキストボックスを配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NullableDemoDotNet6
{
  public partial class FormQuestionQuestionExpressions : Form
  {
    public FormQuestionQuestionExpressions()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int? vi1 = 12;
      int? vi2 = 16;
      int? vi3 = null;
      string? vs1 = "ぺんぎんクッキー";
      string? vs2 = "らくだキャラメル";
      string? vs3 = null;

      int? value1 = vi1 ?? vi2;
      int? value2 = vi3 ?? vi2;

      string? value3 = vs1 ?? vs2;
      string? value4 = vs3 ?? vs2;

      textBox1.Text += value1.ToString() + "\r\n";
      textBox1.Text += value2.ToString() + "\r\n";
      textBox1.Text += value3 + "\r\n";
      textBox1.Text += value4 + "\r\n";
    }
  }
}

解説

vi1 がnullではないため、 value1 には vi1の値 12 が代入されます。
  int? value1 = vi1 ?? vi2;

vi3 はnullであるため、value2 には vi2の値 16 が代入されます。
  int? value2 = vi3 ?? vi2;

vs1 は null ではないため、value3 には vs1の値 ぺんぎんクッキー が代入されます。
  string? value3 = vs1 ?? vs2;

vs3 は null であるため、value4 には vs2の値 らくだキャラメル が代入されます。
  string? value4 = vs3 ?? vs2;

value1 value2 value3 value4 の値をテキストボックスに表示します。
  textBox1.Text += value1.ToString() + "\r\n";
  textBox1.Text += value2.ToString() + "\r\n";
  textBox1.Text += value3 + "\r\n";
  textBox1.Text += value4 + "\r\n";
補足
stirng? はNull許容参照型とななるため、C#7.3以前では利用できません。string?型は、C#8.0以上でのみ利用できます。 C#7.3の場合は、エラーが発生します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。テキストボックスに結果が表示されます。意図したとおりの結果が表示されています。


?? 演算子の動作を確認できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2022-01-30
iPentec all rights reserverd.