(代入先変数) ??= (変数または値)
??= 演算子の意味を紹介します。
新しいC#のコードでは??=
の演算子がコード中に時々見られることがあります。
以前のC#にはなかった書式のため、わかりにくいこともあります。 この記事では、??=
演算子の意味を紹介します。
(代入先変数) ??= (変数または値)
??=演算子の左辺の値がnullでなかった場合に右辺の値が左辺の変数に代入されます。
??=演算子は次のコードで書き換えできます。
int? ivalue = null;
int value1 = 25;
ivalue ??= value1;
int? ivalue = null;
int value1 = 25;
if (ivalue is null) ivalue = value1;
.NET 6でWindows Formアプリケーションを作成します。
??=
演算子は C# 8.0以上で利用可能です。.NET Framework 4.8 のアプリケーションでは ??= 演算子はコンパイルエラーになります。下図のフォームを作成します。フォームにボタンとMultilineプロパティをtrue
に設定した複数行のテキストボックスを配置します。
フォームに下記のコードを実装します。[button1]のclickイベントを実装しています。
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 FormQuestionQuestionEqualExpressions : Form
{
public FormQuestionQuestionEqualExpressions()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int? vi1 = 12;
string? vs1 = "ぺんぎんクッキー";
int? value1 = -1;
int? value2 = null;
string? value3 = "未設定";
string? value4 = null;
value1 ??= vi1;
value2 ??= vi1;
value3 ??= vs1;
value4 ??= vs1;
textBox1.Text += value1.ToString() + "\r\n";
textBox1.Text += value2.ToString() + "\r\n";
textBox1.Text += value3 + "\r\n";
textBox1.Text += value4 + "\r\n";
}
}
}
value1
value2
value3
value4
の変数を宣言し初期値を代入しています。
int? value1 = -1;
int? value2 = null;
string? value3 = "未設定";
string? value4 = null;
??=
演算子で変数に値を代入します。今回のコードの場合、value2
と value4
変数が null の値のため、
value2にvl1の値が代入され、value4にvs1の値が代入されます。value1, value3 変数は null ではないため値の代入はされず、初期値の値がそのまま保存されます。
value1 ??= vi1;
value2 ??= vi1;
value3 ??= vs1;
value4 ??= vs1;
value1,value2,value3,value4の値をテキストボックスに表示します。値はvalue1から順に -1
12
未設定
ぺんぎんクッキー
となります。
textBox1.Text += value1.ToString() + "\r\n";
textBox1.Text += value2.ToString() + "\r\n";
textBox1.Text += value3 + "\r\n";
textBox1.Text += value4 + "\r\n";
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。テキストボックスに結果が表示されます。
??=
演算子の動作を確認できました。