【问题标题】:Passing null to an optional parameter with default value null将 null 传递给默认值为 null 的可选参数
【发布时间】:2019-10-15 12:29:03
【问题描述】:

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

主要方法

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

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

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

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

他们两个会有相同的表现吗?还是一种比另一种更好?

【问题讨论】:

  • 两者都是一样的。第一个优点是即使更改了默认值也能始终如一地工作。
  • @mjwills:请注意,如果 MyClass 是一个类,则除非 C# 更改,否则默认值不会更改——除 null 以外的默认值都不能应用,因为 @ 没有其他编译时常量987654327@ 是可能的。 (当然,一般观点是成立的。)
  • 同意@JeroenMostert。

标签: c# null optional-parameters


【解决方案1】:

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

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

【讨论】:

  • @JonSkeet 你认为参数的顺序也很重要吗?
  • @Çöđěxěŕ:我不明白你的意思。您需要提供更多详细信息 - 最好在新问题中提出。
【解决方案2】:

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

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

        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");
            }
        }

结果

调用 MainMethod(1):7996,862 毫秒

调用 MainMethod(1, null): 848,0054 毫秒

【讨论】:

  • 如果要进行微基准测试,请使用BenchmarkDotNet。它完全避免了您的基准测试遇到的各种陷阱。
  • 请注意,这里大量的大部分时间都花在了写入控制台上。如果没有Console.WriteLine,对这个方法的 10,000 次调用将在眨眼之间完成。
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
相关资源
最近更新 更多