(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


値型にnullを設定出来るNullable型(null許容型)【C#】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 6000.0.34f1


はじめに

C#で値型の変数にnullを入れたいみたいな事がたまにあります。

例えば以下のようなメソッドで「xは常時指定したいyは基本指定しない」という時です。

public void Sample(int x, int y){
  /*xの処理は毎回する*/
  /*yの処理は基本しないが、たまにする)*/
}


オーバーロードでも実現は可能ですが、メソッドが増えるのがちょっと微妙です。

public void Sample(int x, int y) {
  /*yの処理をここでする*/
  Sample(x);
}
  
public void Sample(int x) {
  /*xの処理をここでする*/
}


そんな時に使えるのが、今回紹介するNullable型(null許容型)です。

なお、Unityでの使用を想定しているためDebugを使っています。


値型にもnullを設定出来るNullable型(null許容型)

使い方は簡単、型名の後ろに?を付けるだけ。なお、値は.Valueで取得します。

//yをNullableにして、基本はnullに
public void Sample(int x, int? y = null) {
  Debug.Log($"xは{x}, yは" + (y == null ? "null" : $"{y.Value}"));
}
Sample(x:10);
Sample(x:5, y:-2);


構造体にも使えるので、UnityだとVector3などで重宝します。

public void Sample(Vector3? vector3 = null) {
  if (vector3 != null) {
    /*vector3がnullでない時の処理*/
  }
}


さらにnull条件演算子(?.)を使う事で、

GameObjectがnullの時はそこから取得しようとした物もnullにするみたいな事も出来ます。

/*GameObjectのインスタンスIDを取得*/

GameObject obj = null;
int? id = obj?.GetInstanceID();
Debug.Log(id); //objがnullのためidもnullになる

obj = this.gameObject;
id = obj?.GetInstanceID();
Debug.Log(id); //objが非nullなのでIDが表示される


なお、null合体演算子(??)を使えば、

「◯がnullでなければ◯、nullなら1」みたいなnullチェックを簡単に実装する事も可能です。

int? b = null;
int c = b ?? -1;
Debug.Log(c); //bがnullなので、cには-1が代入されている

b = 5;
c = b ?? -1;
Debug.Log(c); //bがnullでないので、cにはbの値(5)を代入されている


ただし、Nullableはシリアライズ対象じゃないため、

UnityだとInspectorには表示されない点には注意が必要です。

public class Sample : MonoBehaviour {
  public int Value;//Inspectorには表示される
  public int? NullableValue;//Inspectorには表示されない
}