C#におけるnull合体演算子(ぬるがったいえんざんし、null coalescing operator)とは、null許容型や参照型などにおいて、その値がnullの場合に指定した値を返す演算子である。なお、null合体演算子は「??」という記号をもちいるため「??演算子」と記述されることもあるが、ハテナ2個とかググれないわ、読み方に困るわで「null合体演算子」で統一することが望ましいとされている。
null合体演算子はC# 2.0で追加された機能(演算子)で、同じくC# 2.0で追加されたnull許容値型に付随して追加されたものだと思われるが、従来からの参照型でも使える。
目次
記述方法
null合体演算子は以下のように記述する。 この例では、xがnull以外の場合にはxを返し、xがnullの場合にはyを返す。
int z = x ?? y;
これを三項演算子で書くと以下のようになる。 非常にわかりにくく、とくに初心者に見せるためのソースコードとしては最悪である。 三項演算子はN88-BASICなどの時代においてはif文よりも高速に条件分岐できるという理由で乱用され、また「俺かっこいい」と勘違いしたバカが意味もなく乱用するケースも多々見受けられたが、現代においては乱用は避けるべきである。
int z = x != null ? x : y;
これをif文で書くと以下のようになる。 昔ながらの記法であり多くの人にとって明確でわかりやすいが、長ったらしく、複数行にまたがることによる視点移動の多さによりバグの混入が危惧される。また、視点移動を減らそうと括弧の省略や無理に1行で書くとメンテナンス時に混乱を招く恐れがある。
int z;
if (x != null)
{
z = x;
}
else
{
z = y;
}
使用例
MSDNに載ってたコード
MSDNに載っていたソースコードに若干量のコメントを入れたもの。
// null合体演算子のサンプル
class NullCoalesce
{
static int? GetNullableInt()
{
return null;
}
static string GetStringValue()
{
return null;
}
// C#で定番のエントリーポイント
static void Main()
{
// xはnull許容値型
// 値型のケツに?を付けるとnull許容値型になる。
int? x = null;
// null合体演算子の例1
// y = xがnullでなければx, xがnullなら-1
int y = x ?? -1;
// null合体演算子の例2
// GetNullableIntメソッドがnullを返して来たらintの規定値を返す。
int i = GetNullableInt() ?? default(int);
// null合体演算子の例3
// 参照型の場合もnull許容値型の場合と同じ
string s = GetStringValue();
Console.WriteLine(s ?? "Unspecified");
}
}
jQueryとASP.NET MVC
JavaScript(クライアントサイド)にuserオブジェクトがあると仮定し、jQueryのgetJSON関数で、それをASP.NET MVC(サーバーサイド)に送り込む。
jQuery.getJSON("Put", self.vm.user, function(json) {
alert(json);
});
その際にJavaScript側の変数がundefinedの場合、ASP.NET MVCのコントローラーで受けるとC#側の変数はnullになるケースがある。
class UserController : Controller {
public ActionResult Put(User user) {
return new JsonResult() {
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = User.Put(user),
};
}
}
そこでプロパティのセッター(set)を用い、null合体演算子(??)で空文字に置き換える。
// モデルっぽいもの
class User {
private string _name;
public string Name {
get {
return _name;
}
set {
// プロパティにnullを代入しようとしたらnull合体演算子で空文字に置き換える。
_name = value ?? "";
}
}
// データベースに登録するような静的メソッドがあると仮定する
public static User Put(User user) {
// 省略
}
}
関連項目
参考文献