将 null 传递给默认值为 null 的可选参数

Passing null to an optional parameter with default value null

我有一个方法有一个可选的默认值 null。我观察到,那些使用该方法的人将 null 作为可选参数

的值传递

主要方法

public void MainMethod(int id, MyClass model = null)
{
  // Logic goes here
}

我可以看到两种类型的调用,

public void First()
{
  MainMethod(1, null);
}

public void Second()
{
  MainMethod(1);
}

他们两个会有相同的表现吗?或者一个比另一个好?

它们都会产生完全相同的 IL。在Second中,编译器会自动为你提供参数。

默认值总是由编译器在调用点(调用方法的代码段)应用。这有各种缺点 - 特别是在处理默认值更改方面 - 但它确实可以很容易地推断出性能等。

我认为用默认值调用MainMethod(1)会快一点,当我们传递一个为空的参数时,有必要检查它是否是一个以再次分配空值。`

我在循环中执行了调用以计算执行时间,结果如下:

        TimeSpan stop;
        TimeSpan start = new TimeSpan(DateTime.Now.Ticks);
        for (int i = 0; i < 10000; i++)
        {
             MainMethod(1, null);
        }
        
        stop = new TimeSpan(DateTime.Now.Ticks);

        TimeSpan stop2;
        TimeSpan start2 = new TimeSpan(DateTime.Now.Ticks);
        for (int i = 0; i < 10000; i++)
        {
            MainMethod(1);
        }

        stop2 = new TimeSpan(DateTime.Now.Ticks);
        Console.WriteLine(stop.Subtract(start).TotalMilliseconds);
        Console.WriteLine(stop2.Subtract(start2).TotalMilliseconds);



        public static void MainMethod(int id, MyClass model = null)
        {
            if (model == null)
            {
                Console.WriteLine("Is null");
            }
            else
            {
                Console.WriteLine("Is Not null");
            }
        }

结果

call MainMethod(1): 7996,862 ms

call MainMethod(1, null): 848,0054 ms