変数名の後ろに"?" がある - Null条件演算子の利用 - C#

C#で変数名の後ろに"?"記号がついているコードの紹介です。

変数名の後ろの"?"

この記号は「Null条件演算子」を表しています。Null条件演算子を使うことで、nullのチェックをシンプルに記述できます。

Null条件演算子の利用

プログラム1: シンプルなNull条件演算子の利用

コード例と解説

下記のコードを例にします。string型の変数valueに文字列を代入し、文字列の長さをテキストボックスに表示します。このコードは問題なく動作し、テキストボックスに"7"が表示されます。("Penguin"が7文字のため)
  string value = "Penguin";
  textBox1.Text = Convert.ToString(value.Length);

string型の変数valueにnullが代入された場合、このコードは例外(System.NullReferenceException)が発生します。nullオブジェクトに対してLengthプロパティを呼び出したため、例外発生となります。
  string value = null;
  textBox1.Text = Convert.ToString(value.Length);
補足
ちなみに下記ではnullオブジェクトのプロパティやメソッドを呼び出さないため、例外は発生しません。
  string value = null;
  textBox1.Text = Convert.ToString(value);


上記を対策するためには、オブジェクトがnullであるかをチェックする必要があります。
valueがnullでないことを確認してから、valueのLengthプロパティにアクセスします。
  string value = null;
  if (value != null) {
    textBox1.Text = Convert.ToString(value.Length);
  }

従来のC#では上記のコードを記述していましたが、nullチェックのためにif文を記述する必要があります。これをシンプルに記述できるために用意された演算子が、「Null条件演算子」です。「Null条件演算子」を利用すると、上記のコードは下記になります。
「Null条件演算子」はC# 6.0以降(Visual Studio 2015以降)で利用可能です。
  string value = null;
  textBox1.Text = Convert.ToString(value?.Length);
変数 value がnullである場合、"value?.Length" と記述することで、全体がnullの値となり、例外は発生しません。

UI

下図のUIを作成します。テキストボックスとボタンを4つ配置します。

コード

下記のコードを記述します。
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 SimpleNullConditionalOperators
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string value = "Penguin";
      textBox1.Text = Convert.ToString(value.Length);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string value = null;
      textBox1.Text = Convert.ToString(value.Length);
    }

    private void button3_Click(object sender, EventArgs e)
    {
      string value = null;
      if (value != null) {
        textBox1.Text = Convert.ToString(value.Length);
      }

    }

    private void button4_Click(object sender, EventArgs e)
    {
      string value = null;
      textBox1.Text = Convert.ToString(value?.Length);
    }
  }
}

実行結果

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


[button1]をクリックします。"Penguin"の文字列の長さである"7"がテキストボックスに表示されます。


[button2]をクリックします。例外が発生し実行時エラーになります。nullの値に対してプロパティアクセスするため、System.NullReferenceException 例外が発生します。


[button3]をクリックします。例外は発生せず、テキストボックスにも何も表示されません。


[button4]をクリックします。button3と同様に例外は発生せず、テキストボックスにも何も表示されません。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2016-12-22
iPentec all rights reserverd.