【C#】最近良く見かける「?」ってなに?

はじめに

最近C#サンプルコードを見てると「?」を使った記述をちらほら見かけるなぁと思っていました。

昔はあまり見かけなかった書き方なので、使用者が増えるまで放置していようと思っていたのですが、最近はかなり増えてきた印象なので使い方などを整理してみます。

もちろんUnityでも使えます。

Null許容値型

通常変数を定義するときには「int a;」のように書きますが、最近見かけるのが「int? a;」みたいな書き方。

?をつけるとnull許容になり、値型にもnullを代入することができます。

そもそも値型ってなんぞや?という人もいると思いますが、そうなるとポインタとかの話が必要になってくるので、ここでは省略します。

簡単に言うと下記型です。

sbyte
byte
short
ushort
int
uint
long
ulong
float
double
char
bool
decimal
struct
enum

これらの型は通常nullという値を持てないのですが、宣言時に型名に「?」をつける事によってnullという値を持てるようになります。

どういうときに便利かと言うと、例えばList内に指定の値が存在するか?という探索関数を作成したとして今までであれば見つからなかった場合インデックスとして「-1」を返していたわけですが、nullを返すことでより明確に見つからなかったと明示できるようになるというわけです。

public int? GetIndex(List<int> list, int value)
{
    int index = list.IndexOf(value);
    return index >= 0 ? (int?)index : null;
}

サンプルとして上記を書いてみたわけですがIndexOfが-1を返してくるのは今後も変わらなそうなので、わざわざラップwrapする意味ある?と思わなくもないですね。

Null 合体演算子「??」

これ翻訳あってる?と思わなくもない命名ですが「??」を使用することで先ほど上げたNull許容値型や参照型のnullチェックを簡潔に書くことができます。

下記例123いずれも同じ意味になります。leftValueがnullだったらrightValueを、nullでなければそのままleftValueを返します。

//例1
var result = leftValue ?? rightValue;

//例2
var result = leftValue == null ? rightValue : leftValue;

//例3
if(leftValue == null)
{
    result = rightValue;
}
else
{
    result = leftValue;
}

Null合体代入演算子「??=」

??と=をくっつけて更に簡潔に書ける形にしたもの。

a = a + 10;
a += 10;

上記が同じであるのと一緒ですね。

leftValue = leftValue ?? rightValue;
leftValue ??= rightValue;

と書くことができます。

また下記のようにクラスの初期化などでも使えそうです。

ClassA instance;

void Initialize()
{
    instance ??= new ClassA();
}

さいごに

C#はかなり頻繁に更新されていて、気づいたら知らない書き方が増えてるということも多いですが、適宜キャッチアップしていけると良いですね。

新しい書き方はする場合には、チーム内への浸透も重要になるので、チームで働いている方は定期的に勉強会をするのも有効かと思う今日このごろです。

コメント

タイトルとURLをコピーしました