この記事でのバージョン
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には表示されない }
![]() |