「C Sharp/null合体演算子」の版間の差分
imported>Fallout New Tokyo |
imported>Fallout New Tokyo |
||
1行目: | 1行目: | ||
− | [[C Sharp|C#]]における'''null合体演算子''' | + | [[C Sharp|C#]]における'''null合体演算子'''(読み:ぬるがったいえんざんし、[[英語]]:null coalescing operator)とは、[[C Sharp/null許容型|null許容型]]や[[C Sharp/参照型|参照型]]などにおいて、その[[値]]が[[C Sharp/null|null]]の場合に指定した値を返す[[演算子]]である。なお、null合体演算子は「'''??'''」という記号をもちいるため「'''??演算子'''」と記述されることもあるが、ハテナ2個とか[[ググれ]]ないわ、読み方に困るわで「null合体演算子」で統一することが望ましいとされている。 |
− | null合体演算子はC# 2. | + | null合体演算子はC# 2.0で追加された機能(演算子)であり、同じくC# 2.0で追加された[[C Sharp/null許容値型|null許容値型]]に付随して追加されたものだと思われるが、従来からの[[C Sharp/参照型|参照型]]でも使える。 |
== 記述方法 == | == 記述方法 == | ||
12行目: | 12行目: | ||
これを[[三項演算子]]で書くと以下のようになる。 | これを[[三項演算子]]で書くと以下のようになる。 | ||
非常にわかりにくく、とくに初心者に見せるための[[ソースコード]]としては最悪である。 | 非常にわかりにくく、とくに初心者に見せるための[[ソースコード]]としては最悪である。 | ||
− | [[三項演算子]]は[[N88-BASIC]]などの時代においては[[if文]]よりも高速に[[条件分岐]] | + | [[三項演算子]]は[[N88-BASIC]]などの時代においては[[if文]]よりも高速に[[条件分岐]]できるという理由で乱用され、また「俺かっこいい」と勘違いしたバカが意味もなく乱用するケース([[中級者病]])も多々見受けられたが、現代においては乱用は避けるべきである。 |
<source lang="csharp"> | <source lang="csharp"> | ||
int z = x != null ? x : y; | int z = x != null ? x : y; | ||
55行目: | 55行目: | ||
int? x = null; | int? x = null; | ||
− | + | // null合体演算子の例1 | |
// y = xがnullでなければx, xがnullなら-1 | // y = xがnullでなければx, xがnullなら-1 | ||
int y = x ?? -1; | int y = x ?? -1; | ||
63行目: | 63行目: | ||
int i = GetNullableInt() ?? default(int); | int i = GetNullableInt() ?? default(int); | ||
− | + | // null合体演算子の例3 | |
− | + | // 参照型の場合もnull許容値型の場合と同じ | |
string s = GetStringValue(); | string s = GetStringValue(); | ||
Console.WriteLine(s ?? "Unspecified"); | Console.WriteLine(s ?? "Unspecified"); |
2014年3月6日 (木) 06:38時点における最新版
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) {
// 省略
}
}