C# - Null許容型とNull合体演算子
Null許容型
通常は参照型の変数にしかnullは代入できないが、値型の変数でnull値を使いたい場合に使用する。内部的にはnullか否かのフラグと値を保持する変数を持っていると思われます。
値を保持しているか否かの判断には HasValue プロパティを利用する。値へのアクセスはそのままアクセスするか Vlaue プロパティを使用する。
通常型との変換については、通常型から許容型へはそのまま代入可能。許容型から通常型へはキャストが必要となる。ただしnull値の場合は実行時エラーとなるので事前に null か否かの判定は必須となる。
許容型同士の演算では、項に一つでも null値が存在すれば、結果は null となる。
using System; //null許容型(nullable) class MyMain { static void Main(string[] args) { int? n1 = null; int? n2 = 123; int? n3; Console.WriteLine("n1 has value? : {0}", n1.HasValue);//False //Console.WriteLine("n1 value is : {0}", n1.Value); //実行時エラー Console.WriteLine("n1 is : {0}", n1); //表示されない Console.WriteLine("n2 has value? : {0}", n2.HasValue);//True Console.WriteLine("n2 value is : {0}", n2.Value); //123 Console.WriteLine("n2 is : {0}", n2); //123 //通常型との型変換 // int d1 = 456; int d2; n1 = d1; Console.WriteLine("n1 is : {0}", n1); //456 //通常型への変換はキャストが必要 //d2 = n1; //エラー d2 = (int)n1; Console.WriteLine("d1 is : {0}", d1); //456 //nullを変換すると n1 = null; //d2 = (int)n1; //実行時エラー //double型 // double? f1 = null; Console.WriteLine("f1 has value? : {0}", f1.HasValue);//False f1 = 456.789; Console.WriteLine("f1 has value? : {0}", f1.HasValue);//True Console.WriteLine("f1 value is : {0}", f1.Value); //456.789 Console.WriteLine("f1 is : {0}", f1); //456.789 //演算 // n1 = null; n2 = null; //null + null n3 = n1 + n2; Console.WriteLine("n3(null + null) has value? : {0}", n3.HasValue); //False n1 = 1; //null + val n3 = n1 + n2; Console.WriteLine("n3(val + null) has value? : {0}", n3.HasValue); //False n2 = 2; // val + val n3 = n1 + n2; Console.WriteLine("n3(val + val ) has value? : {0}", n3.HasValue); //True Console.WriteLine("n3 is : {0}", n3); } }
Null合体演算子(??)
左項(A)を評価し null でなければその値を、nullであれば右項(B)の評価結果を返す。
A ?? B
using System; //null 合体演算子 class MyMain { static void Main(string[] args) { int? d1 = null; int? d2 = 123; Console.WriteLine(d1 ?? -1); // -1 Console.WriteLine(d2 ?? -1); // 123 } }