より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C#でstring + nullって、アプリは落ちない?

仕事で、こんなコードを見かけました

   private static void test(string a = null) {
        Console.WriteLine("argument = " + a);
    }

メソッドを呼び出す時引数を省略した場合、引数はnullになります。

すると、例外になるから、ヤバくない? って。

ですが、このメソッド正しく動作します。

f:id:rimever:20200509091113p:plain
例外にならず、string.Empty扱いで出力されます。

ただ、怖いですね。

製品からサービスとして意味合いが強くなった現代では頻繁に改修がされます。

そこで、あまり考えずに、以下みたいに改修したら、例外になります。

   private static void test(string a = null) {
        Console.WriteLine("argument = " + a);
        Console.WriteLine("length = " + a.Length);
    }

f:id:rimever:20200509091712p:plain

こんなコードがリリースされると、どーして確認しなかったんだ、再発防止案だせーと大騒ぎになるわけですが、そもそも地雷を埋めた方が悪いでしょう。

あらかじめ手を打っておくべきです。

やはり危ないコードなので避けるべきでしょう。

デフォルト値にstring.Emptyを使いたいところですが、引数にはstring.Emptyは使えませんので、デフォルト値に使うとしたら""でしょうか。

   private static void test(string a = "") {
        Console.WriteLine("argument = " + a);
        Console.WriteLine("length = " + a.Length);
    }

もしくは、メソッドを一つ増やして、引数なしのメソッドを用意してあげるかですかね。ここまで来ると大掛かりな気もします。

   private static void test() {
            test("");
    }

おまけ

stringではなく、nullの任意のクラスオブジェクトをConsole.WriteLineさせても例外になりません。

using System;
                    
public class Program
{
    public class Person {
        public string Name {get; set;}
    }
    
    public static void Main()
    {
        test();
    }
    
    private static void test(Person a = null) {
        Console.WriteLine("start");
        Console.WriteLine(a);
        Console.WriteLine("end");
    }
}

f:id:rimever:20200509091601p:plain