nullについて

# 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