はじめに
プロジェクトのソースコードで以下のような値を初期化するときに
MinValueを代入している書き方を見て、
なんでMinValueを代入しているのかわからなかったため、少し調べてみました。
float i = float.MinValue;
if ( 条件1 )
{
i = 1.0;
}
if ( 条件2 )
{
i = 2.0;
}
実は・・・
実はこれはローカルルールになりがちな古い書き方でした。値型としてなんらかの有効な値と値として無効な場合を表現したいときに、
参照型だとnullを使ってオブジェクトが何も参照していないことを表しますが、値型だと以下のようにnullを代入できません。
そこで、値として無効な場合を表現するためにMinValueを代入していたのです。。(わかりずらい。。)
float i = null;
C#2以降だとこう書くのが良い
C#2以降だと以下のように変数をnull許容型として扱うことでnull代入して書く方がわかりやすいので良いみたいです。
float? i = null;
null許容型について
null許容型はnull代入できない値型の変数にnullを代入したいときに使うものです。
null許容型を使うときに注意すべき点
値型からnull許容型への変換はできますが、逆はできないので注意する。
null許容型は元々の値型にnullを加えたもので、値型の拡大変換となるので、
元々の値型からの変換は暗黙的にできますが、逆は以下のようにnullであるがを確認して値を取りだしてやる必要があります。
int i = 108;
int? num = i; #こちらは問題ない
int? num = 108
int i = (int)108; # 逆は明示的にキャストしてやる必要がある。ただし、nullの場合はエラー(InvalidOperationException例外)になる
# 以下のようにnullチェック
if (num != null)
{
int i = (int)num;
}
# 以下のようにも書いても同じ
if (num.HasValue)
{
int i = (int)num;
}
参考
- 独習C# 山田祥寛