C Sharp/null許容型
C#におけるnull許容型(ぬるきょようあたいがた)とは、本来であればnull値を受け入れない値型を拡張し、null値を受け入れるようにしたものである。
一部ではnull許容値型と「値」をつけて呼ばれることもある。一文字違いのどうでもいい点であり、大半のC#使いには「null許容」まで言えば通じるのでどちらを使っても良い。MSDN上でも両方とも使われている。
本来「ぬるり」が発生しないはずの値型において「ぬるり」が発生するようになるので取扱いには注意する必要がある。
目次
構文
null許容型の実体はジェネリックなNullable<T>構造体であり、本来であれば以下のように記述する。
Nullable<int> x;
ただ、上記の記法はキーボードを打つ量が多いということで、C#には値型の末尾に「?」を付けることでnull許容型を表すという省略表記が用意されており、通常はこちらを使うのが一般的である。
int? x;
概要
null許容型はもともとnull値を受け入れない値型専用であり、もともとnull値を受け入れる参照型には使えない(使う必要がない)。
Nullable<T>構造体では値型以外を受け入れないようにするため、Nullable<T>構造体の宣言において以下のようにwhereによる縛りを付けることで実現している。
[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
なお、Nullable<T>自体も値型だが、「Nullable<Nullable<int>> n;」などとは書けない。
その他
データベースとのマッピングにnull許容型を使っていると、それとは正反対の参照型がnullを受け入れなくなるNotNullable<T>が欲しくなるが、そのようなものは今のところ無いと思われる。とくにデータベースとのマッピングにnull許容型を使っていると、データベース側のTEXT NOT NULLなどと対応するnullを受け入れないstringクラスなどが欲しくなる。
個人的にはプロパティのセッターでnull合体演算子を使い強引に回避する方法で何とかしているが、この回避策ではC# 3.0で導入された自動プロパティが使えないので非常に面倒な古くさい記法となってしまっている。
用途
RDBMS
MySQLやOracle Database、SQL ServerなどのRDBMS(俗に言うデータベース)では、フィールドごとにNULLを受け入れるか受け入れないかを指定できるが、そのような外部システムの型とC#の型をマッピングする際にムダに悩む必要がなくなる。
その他
関連項目
参考文献