(変数または値) ?? (変数または値)
?? 演算子 (null 合体演算子) の意味を紹介します。
新しいC#のコードでは??
の演算子がコード中に見られることがあります。以前のC#にはなかった書式のため、わかりにくいこともあります。
この記事では、??
演算子、null 合体演算子の意味を紹介します。
(変数または値) ?? (変数または値)
??演算子の左辺の値がnullであった場合、??演算子の右辺の値が返されます。
??演算子は次のように書き換えできます。
int? ivalue = value1 ?? value2;
int? ivalue;
if (value1 == null) ivalue = value2; else ivalue = value1;
.NET6 でWindowsFormアプリケーションを作成します。
下図の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]をクリックします。テキストボックスに結果が表示されます。意図したとおりの結果が表示されています。
??
演算子の動作を確認できました。