メインメニューを開く

差分

C Sharp/null合体演算子

5,053 バイト追加, 2012年6月12日 (火) 06:53
ページの作成:「C#における'''null合体演算子'''(ぬるがったいえんざんし、null coalescing operator)とは、[[C Sharp/null許容値型|null許容値...」
[[C Sharp|C#]]における'''null合体演算子'''(ぬるがったいえんざんし、null coalescing operator)とは、[[C Sharp/null許容値型|null許容値型]]や[[C Sharp/参照型|参照型]]などにおいて、その[[値]]が[[C Sharp/null|null]]の場合に指定した値を返す[[演算子]]である。
null合体演算子は「??」という記号をもちいるため「'''??演算子'''」と記述されることもあるが、ハテナ2個とか[[ググれ]]ないわ、読み方に困るわで「null合体演算子」で統一することが望ましい。

null合体演算子はC# 2.0で追加された機能(演算子)で、同じくC# 2.0で追加された[[C Sharp/null許容値型|null許容値型]]に付随して追加されたものだと思われるが、従来からの[[C Sharp/参照型|参照型]]でも使える。

== 記述方法 ==
null合体演算子は以下のように記述する。
この例では、xがnull以外の場合にはxを返し、xがnullの場合にはyを返す。
<source lang="csharp">
int z = x ?? y;
</source>

これを[[三項演算子]]で書くと以下のようになる。
非常にわかりにくく、とくに初心者に見せるための[[ソースコード]]としては最悪である。
[[三項演算子]]は[[N88-BASIC]]などの時代においては[[if文]]よりも高速に[[条件分岐]]できるという理由で乱用され、また「俺かっこいい」と勘違いしたバカが意味もなく乱用するケースも多々見受けられたが、現代においては乱用は避けるべきである。
<source lang="csharp">
int z = x != null ? x : y;
</source>

これを[[if文]]で書くと以下のようになる。
昔ながらの記法であり多くの人にとって明確でわかりやすいが、長ったらしく、複数行にまたがることによる視点移動の多さにより[[バグ]]の混入が危惧される。また、視点移動を減らそうと括弧の省略や無理に1行で書くと[[メンテナンス]]時に混乱を招く恐れがある。
<source lang="csharp">
int z;
if (x != null)
{
z = x;
}
else
{
z = y;
}
</source>

== 使用例 ==
=== MSDNに載ってたコード ===
[[MSDN]]に載っていた[[ソースコード]]に若干量の[[コメント]]を入れたもの。
<source lang="csharp">
// 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");
}
}
</source>

=== jQueryとASP.NET MVC ===
[[JavaScript]]([[クライアントサイド]])にuserオブジェクトがあると仮定し、[[jQuery]]のgetJSON関数で、それを[[ASP.NET MVC]]([[サーバーサイド]])に送り込む。
<source lang="javascript">
jQuery.getJSON("Put", self.vm.user, function(json) {
alert(json);
});
</source>

その際に[[JavaScript]]側の変数が[[JavaScript/undefined|undefined]]の場合、[[ASP.NET MVC]]の[[コントローラー]]で受けると[[C Sharp|C#]]側の変数は[[null]]になるケースがある。
<source lang="csharp">
class UserController : Controller {
public ActionResult Put(User user) {
return new JsonResult() {
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = User.Put(user),
};
}
}
</source>

そこで[[プロパティ]]の[[セッター]](set)を用い、null合体演算子(??)で[[空文字]]に置き換える。
<source lang="csharp">
// モデルっぽいもの
class User {
private string _name;

public string Name {
get {
return _name;
}
set {
// プロパティにnullを代入しようとしたらnull合体演算子で空文字に置き換える。
_name = value ?? "";
}
}

// データベースに登録するような静的メソッドがあると仮定する
public static User Put(User user) {
// 省略
}
}
</source>

== 関連項目 ==
* [[C Sharp|C#]]
* [[C Sharp/参照型|C#/参照型]]
* [[C Sharp/null許容値型|C#/null許容値型]]
* [[C Sharp/null|C#/null]]

== 参考文献 ==
<references/>

== 外部リンク ==
* [http://msdn.microsoft.com/ja-jp/library/ms173224.aspx ?? 演算子 (C# リファレンス) - MSDN]

{{stub}}
匿名利用者