将 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
我有一个方法有一个可选的默认值 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