C#での null(ヌル)についての 説明
null
null は、どこも参照していないことを示す値です。 参照型の変数には既定値として null が代入されます。
class Program { static void Main(string[] args) { myClass obj; obj.hello(); Console.Read(); } } class myClass { public void hello() { Console.WriteLine("Heloo"); } }
このコードをコンパイルすると
エラー CS0165 未割り当てのローカル変数 'obj' が使用されました。
と 表示されて コンパイルできません。 これは null安全 な 言語では コンパイル時に obj が さにも参照していない null が代入された 状態で 16行目の処理をしないように チェックしてくれたからです。
class Program { static void Main(string[] args) { myClass obj = new myClass(); obj = null; obj.hello(); // エラー Console.Read(); } }
ただし、上記のような場合は コンパイルは出来ます。 ただし実行時には エラーになります。
class Program { static void Main(string[] args) { myClass obj = new myClass(); obj = null; if (obj != null) obj.hello(); Console.Read(); } }
上記のコードならエラーは 起きません。null 安全は 万能ではないので null の判定が必要なもは 基本的にするものだと考えた方がいいです。
null許容型
C# で null は参照してないことを示す値なので 参照型で使いますが、値型には 直接値が入っているため null という 考え方はありません。
それでも 値型に null を代入したい時は null許容型(Nulllable Type)を使います。
static void Main(string[] args) { int? a = null; // int型のNull許容型 if (a == null) Console.WriteLine("Null"); Console.Read(); }
Null
null許容型のプロパティ
null許容型には HasValue と Value の 2つのプロパティを持っていて
HasValue は null の 有無を( false だと null )
Value には HasValue が True の 場合 は 値を返します。
static void Main(string[] args) { int? a = 10; Console.WriteLine(a.HasValue); Console.WriteLine(a.Value); Console.WriteLine(a); Console.Read(); }
True 10 10
型キャスト
null許容型の変数の値を 値型の変数に代入するときは 明示的は型キャストが必要です。 逆は必要ありません。
int? a = 10; int b; b = (int)a + 5; // 型キャストが必要 a = b + 3;
null 合体演算子
?? 演算子は 左側が null ではない場合、左側のオペランドの値が返され、それ以外の場合(つまり 左側がnull の場合 )は、右側のオペランドが返されます。
int? a; ・・・・・・ int c = a ?? 0;
上記の3行目は、a が null で 無い場合は a の値が c に代入され 、a の値が null の場合は 0 が 代入されます。