0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

nullについて

Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?