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 が代入された 状態で 6行目の処理をしないように チェックしてくれたからです。
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 が 代入されます。
コメント