2

不确定这是否是一个多余的问题,但考虑一下我有这些方法:

void Foo(SomeClass x)
{
    //Some code
}

void Foo(AnotherClass x)
{
    //Some code
}

假设我想用 null 调用特定的重载(SomeClass 之一),这是我的选择:

Foo((SomeClass)null)

Foo(null as SomeClass)

Foo(default(SomeClass))

基本上,哪个是最好的选择?不同方法之间是否存在显着的性能差异?一种特定的方式通常被认为比其他方式更“优雅”吗?

谢谢

4

1 回答 1

5

选项 4:创建另一个重载:

void Foo()

使用需要强制转换的显式 null 调用?嗯……呜……

“正式”回答你的问题。尝试一下!

var sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++) {
    Foo(null as string);
}
Console.WriteLine(sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++) {
    Foo((string)null);
}           
Console.WriteLine(sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++) {
    Foo(default(string));
}
Console.WriteLine(sw.ElapsedMilliseconds);

Console.ReadLine();

对于所有 3 种方法,我得到了 ~4ms。

当我在反射器中打开程序时,我看到所有的调用都变成了: Foo((string) null);

因此,您可以选择您认为最易读的任何内容。IL 最终都完全相同。

于 2012-09-19T00:53:14.413 回答