Передача null в необязательный параметр со значением по умолчанию null - PullRequest
1 голос
/ 15 октября 2019

У меня есть метод с одним необязательным значением по умолчанию null. Я заметил, что те, кто использует этот метод, передают null в качестве значения для необязательного параметра

Основной метод

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

Существует 2 типа вызовов, которые я могу видеть,

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

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

Будет ли у них обоих одинаковая производительность? Или один лучше другого?

Ответы [ 2 ]

7 голосов
/ 15 октября 2019

Они оба приведут к одному и тому же IL. В Second компилятор просто предоставляет вам аргумент автоматически.

По умолчанию компилятор всегда применяет компилятор на месте вызова (фрагмент кода, вызывающий метод). Это имеет различные недостатки, особенно в плане обработки изменений значения по умолчанию, но позволяет легко оценить производительность и т. Д.

0 голосов
/ 15 октября 2019

Я думаю, что вызов 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");
            }
        }

результат

вызов MainMethod (1): 7996 862 мс

вызов MainMethod (1, ноль): 848,0054 мс

...