nullについて
nullは「空」や「無」を意味する定数だそうです。
参照型(null参照許容型)
参照型では何も参照していなければ、nullになり(=null)と同じ状態だそうです。
しかし、ワーニングが出るため、型の後に?をつけてワーニングを消すことが可能となったみたいです。
値型(null許容型)
基本nullは無かったみたいですが、値型でもnullが可能になりました。
その為に参照型と同じく型の後に?を付けます。
nullの種類別調査
この2つについて調査してみます。
参照型
.cs
public class Class1
{
public string Text { set; get; } = string.Empty; //ワーニングを消す
string? NullText { set; get; }
public void SetNull()
{
Text = null; //ワーニング
Console.WriteLine("Text = null");
Print(Text);
NullText = null;
Console.WriteLine("NullText = null");
Print(NullText);
Console.WriteLine("");
}
public void SetText()
{
Text = "Text";
Console.WriteLine("Text = Tex");
Print(Text);
NullText = "NullText";
Console.WriteLine("NullText = NullTex");
Print(NullText);
Console.WriteLine("");
}
public void SetEmpty()
{
Text = string.Empty;
Console.WriteLine("Text = string.Empty");
Print(Text);
NullText = string.Empty;
Console.WriteLine("NullText = string.Empty");
Print(NullText);
Console.WriteLine("");
}
private void Print(string? text)
{
/*
if (text is not null)
{
Console.WriteLine($"{text} size= {text.Length}");
return;
}
Console.WriteLine($"null size= 0");
*/
// Console.WriteLine($"{text} size= {text?.Length}");
Console.WriteLine($"{text??"NULL"} size= {text?.Length??0}");
}
}
値型
.cs
public class Class2
{
int count;
int? nullCount;
public void SetNumberNull()
{
//count = null; error
Console.WriteLine($"count= null ##error");
nullCount = null;
Console.WriteLine($"nullCount= null ");
Print(nullCount);
Console.WriteLine("");
}
public void SetNumber1()
{
count = 1;
Console.WriteLine($"count = {count}");
Print(count);
nullCount = 1;
Console.WriteLine($"nullCount = {nullCount}");
Print(nullCount);
Console.WriteLine("");
}
private void Print(int? value)
{
if (value.HasValue)
{
Console.WriteLine($"{value} type= {value.GetType()}");
return;
}
Console.WriteLine($"null");
}
}
テストコード
.cs
public class Program
{
static void Main(string[] args)
{
var cs1 = new Class1();
cs1.SetEmpty();
cs1.SetNull();
cs1.SetText();
var cs2 = new Class2();
cs2.SetNumberNull();
cs2.SetNumber1();
}
}
結果
参照型
Text = string.Empty
size= 0
NullText = string.Empty
size= 0
Text = null
NULL size= 0
NullText = null
NULL size= 0
Text = Tex
Text size= 4
NullText = NullTex
NullText size= 8
値型
count= null ##error
nullCount= null
null
count = 1
1 type= System.Int32
nullCount = 1
1 type= System.Int32
結論
null参照許容型
?をつけることにより、ワーニングが出なくなるだけでなく、nullの判定が以下の様に短く簡単に書く事が可能になったようです。
- null合体演算子
var text= GetText(code)??DefaultText();
GetText(code)がnullだったらDefaultTextをtextに - null合体代入演算子
var text ??=DefaultText();
textがnullだったらDefaultTextをtextに - null条件演算子
return sample?.Name;
sampleがnullでなかったらsample.Nameを、nullならnullを返す。
null許容型
?をつけることにより、is null 以外でHasValueでも判定できるようになったみたいです。
思い違い
最初try-catchでエラーハンドリングするものだと思っていたのですがnullに関しては扱いが違うのですね。
参照先
[改訂新版]実戦で役立つ C#プログラミングのイディオム/定石&パターン
https://www.amazon.co.jp/dp/4297143070/ref=pd_lpo_d_sccl_1/358-2678425-2695319?psc=1