?? 演算子 (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を愛用