エンジニアの将来って?

現在7年目のCOBOL→Java→C#エンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

【C#】はてな2つの演算子、null合体演算子について解説します

こんにちは。たいら(@tairaengineer2)です。
この記事では、C#はてな2つの演算子、null合体演算子について解説します。

 

前提条件

この記事では、Visual Studio 2017 Communityを使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

はてな2つ(null合体演算子)とは

null合体演算子は、nullかどうかチェックしたいときに使われる演算子です。

?? 演算子は、null 合体演算子と呼ばれます。
左側のオペランドが null 値でない場合には左側のオペランドを返し、null 値である場合には右側のオペランドを返します。

?? 演算子 - C# リファレンス | Microsoft Docsから引用させて頂きました

null合体演算子は、こういう風に使います。

string tanaka = null;
string suzuki = "鈴木";

string name = tanaka ?? suzuki;

上の例だと、まず変数tanakaをnullかどうかチェックします。
tanakaはnullなので、nameにはsuzukiの鈴木が設定されます。

こんな感じで、ある変数がnullかどうか調べてるときに使われます。

null合体演算子を使うと、どんな良いことがあるのか?

null合体演算子を使うと、コンパイル通るけど、実行しないと分からないエラー回避することができます。

どういうことなのか、実際のプログラムをみてください。

エラーを発生させるC#の内容

  1. Dog
  2. Program(メイン)

の2つ作ります。

nullのDogクラスのオブジェクトを作成します。
そのオブジェクトに対してメインプログラムで参照してコンソールに表示させようとして、例外を発生させます。

コンソールプロジェクトを作成するやり方は下の記事をご参考ください。

www.tairax.com

C#:Dogクラス

namespace ConsoleApp1
{
    /// <summary>
    /// 犬クラス
    /// </summary>
    class Dog
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Dog()
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        /// <param name="age">年齢</param>
        public Dog(string name, int age)
        {
            Name = name;
            Age = age;
        }

        /// <summary> 名前 </summary>
        public string Name { get; set; }
        /// <summary> 年齢 </summary>
        public int Age { get; set; }
    }
}

C#:Program

using System;

namespace ConsoleApp1
{
    /// <summary>
    /// NullReferenceException例外を発生させるプログラム
    /// </summary>
    class Program
    {
        /// <summary>
        /// メイン
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog = null;

            if(dog.Name == "ポチ")
            {
                Console.WriteLine("イヌの名前はポチ");
            }
        }
    }
}

実行結果

f:id:Tairax:20190316141356p:plain


ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブ
ジェクト インスタンスに設定されていません。
   場所 ConsoleApp1.Program.Main(String[] args) 場所 C:\Users\○○○○○\source\re
pos\ConsoleApp1\ConsoleApp1\Program.cs:行 19
続行するには何かキーを押してください . . .

このようにコンパイルは通っても、実行するときSystem.NullReferenceException例外が発生してしまいます。

では、回避するプログラムを書いてみます。

null合体演算子を使うC#の内容

エラーを発生させたように

  1. Dog
  2. Program(メイン)

の2つ作ります。

nullのDogクラスのオブジェクトを作成します。
そのオブジェクトに対してメインプログラムで参照し、コンソールに表示させようとします。
が、null合体演算子を使って、表示するオブジェクトのnullチェックをします。
もしnullだったら、別のオブジェクトが作成します。
その結果をコンソールに表示します。

コンソールプロジェクトを作成するやり方は下の記事をご参考ください。

www.tairax.com

C#:Dogクラス

namespace ConsoleApp1
{
    /// <summary>
    /// 犬クラス
    /// </summary>
    class Dog
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Dog()
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        /// <param name="age">年齢</param>
        public Dog(string name, int age)
        {
            Name = name;
            Age = age;
        }

        /// <summary> 名前 </summary>
        public string Name { get; set; }
        /// <summary> 年齢 </summary>
        public int Age { get; set; }
    }
}

C#:Program

using System;

namespace ConsoleApp1
{
    /// <summary>
    /// null合体演算子を使うプログラム
    /// </summary>
    class Program
    {
        /// <summary>
        /// メイン
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog = null;
            Dog displayDog = dog ?? new Dog("ポチ", 2);
            Console.WriteLine("イヌの名前は" + displayDog.Name);
        }
    }
}

実行結果

f:id:Tairax:20190316145916p:plain

イヌの名前はポチ
続行するには何かキーを押してください . . .

では、解説します。

解説

null合体演算子を使っているところはここです。

Dog displayDog = dog ?? new Dog("ポチ", 2);

null合体演算子は、dogがnullなので、右のオブジェクトを参照します。
表示するdisplayDogはDog型なので、右のオブジェクトはDog型のオブジェクトでなければなりません。
なので、新しくオブジェクトを作成して、displayDogに設定しています。

こういう風に、新しくオブジェクトを作るのもアリです。

まとめ:null合体演算子を使ってみよう!

以上がnull合体演算子の解説です。

あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ

 

ほかにもC#勉強記事を書いてます。
よければご参考ください。

【C#】整数を2進数、8進数、16進数に変換するやり方を解説します

【C#】ある文字を指定した回数だけ連続する文字列を作成するやり方を解説します

【C#】コンストラクタからコンストラクタを呼ぶ、コンストラクタ初期化子について解説します