C# 6.0 自動実装プロパティの初期化

csharp-tokyo.connpass.com

C# Tokyo 2.0から始めるC#入門/再入門に参加して今まで全然使ってなかったけどもこれは便利だなと思った機能を上げていきたいと思います。

 

自動実装プロパティの初期化

C#では自動実装プロパティはよく使っていましたが、初期値を設定するにはコンストラクタなどで設定するのが通常でした。

この場合、プログラムミスなどでNULLの危険性がはらんでいます。特に、旧来の.NET Framewokなどではstring型などNULLを許容する型が存在しており多く使われていることが想像できます。

意図しない、NULLをなくすためにも初期値として何らかの値を入れる。例えば空白を初期値で持たせるなどの処置が多くのプロパティで必要になるのではないかと考えます。

 

コード

    class Program
    {
        static void Main(string[] args)
        {
            prpTest test = new prpTest();
            
            Console.WriteLine($"prp1      : {test.prp1}");
            Console.WriteLine($"prp2      : {test.prp2}");
            Console.WriteLine($"intprp    : {test.intprp}");
            Console.WriteLine($"notinit   : {test.notinit}");
            Console.WriteLine($"intnotinit: {test.intnotinit}");
            if (test.notinit == null)
            {
                Console.WriteLine("test.notinit はNULLです。");
            }

        }

        class prpTest
        {
            public string prp1 { get; set; } = "hoge";
            public string prp2 { get; set; } = "fuga";
            public int intprp { get; set; } = 10;

            public string notinit { get; set; }
            public int intnotinit { get; set; }
        }
    }

 実行結果

prp1      : hoge
prp2      : fuga
intprp    : 10
notinit   :
intnotinit: 0
test.notinit はNULLです。    

 

プロパティの行にそのまま初期値がかけるので初期値の入れ忘れがない。

また、従来の動作だと実行結果の示すとおりstring型の初期値はNULLであるのでなにも値がセットされないままであるとNULLのままであり例外の発生の温床になってしまう。

また、近頃のC#の指針にもあるようにNULLに対して非常に厳しくなってきているので初期値の入れ忘れという観点から見ればコンストラクタで設定するよりもこの機能を活用した方がよいと感じた。