差分

ナビゲーションに移動 検索に移動

C Sharp/null許容型

2,924 バイト追加, 2012年6月12日 (火) 16:18
ページの作成:「C#における'''null許容型'''(ぬるきょようあたいがた)とは、本来であればnull値を受け入れない値型を...」
[[C Sharp|C#]]における'''null許容型'''(ぬるきょようあたいがた)とは、本来であればnull値を受け入れない[[C Sharp/値型|値型]]を拡張し、null値を受け入れるようにしたものである。

== 構文 ==
null許容型の実体は[[C Sharp/ジェネリック|ジェネリック]]なNullable<T>構造体であり、本来であれば以下のように記述する。
<source lang="csharp">
Nullable<int> x;
</source>

ただ、上記の記法は[[キーボード]]を打つ量が多いということで、[[C Sharp|C#]]には[[C Sharp/値型|値型]]の末尾に「'''?'''」を付けることでnull許容型を表すという省略表記が用意されており、通常はこちらを使うのが一般的である。
<source lang="csharp">
int? x;
</source>

== 概要 ==
null許容型はもともとnull値を受け入れない値型専用であり、もともとnull値を受け入れる参照型には使えない(使う必要がない)。

Nullable<T>構造体では値型以外を受け入れないようにするため、Nullable<T>構造体の宣言において以下のようにwhereによる縛りを付けることで実現している。
<source lang="csharp">
[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
</source>

なお、Nullable<T>自体も値型だが、「Nullable<Nullable<int>> n;」などとは書けない。

== その他 ==
[[データベース]]とのマッピングにnull許容型を使っていると、それとは正反対の参照型がnullを受け入れなくなるNotNullable<T>が欲しくなるが、そのようなものは今のところ無いと思われる。とくにデータベースとのマッピングにnull許容型を使っていると、データベース側のTEXT NOT NULLなどと対応するnullを受け入れないstringクラスなどが欲しくなる。

個人的には[[プロパティ]]の[[セッター]]で[[C Sharp/null合体演算子|null合体演算子]]を使い強引に回避する方法で何とかしているが、この回避策ではC# 3.0で導入された[[C Sharp/自動プロパティ|自動プロパティ]]が使えないので非常に面倒な古くさい記法となってしまっている。

== 用途 ==

=== RDBMS ===
[[MySQL]]や[[Oracle Database]]、[[SQL Server]]などの[[RDBMS]](俗に言う[[データベース]])では、フィールドごとにNULLを受け入れるか受け入れないかを指定できるが、そのような外部システムの型とC#の型をマッピングする際にムダに悩む必要がなくなる。

== その他 ==


== 関連項目 ==
* [[C Sharp/null合体演算子|null合体演算子]]
* [[C Sharp/値型|値型]]

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

== 外部リンク ==
* [http://msdn.microsoft.com/ja-jp/library/1t3y8s4s.aspx null 許容型 (C# プログラミング ガイド) - MSDN]

{{stub}}
匿名利用者

案内メニュー