2

これが少し余分な質問であるかどうかはわかりませんが、次の方法があると考えてください。

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

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

そして、特定のオーバーロード (SomeClass のもの) を null で呼び出したいとしましょう。ここに私のオプションがあります:

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つのアプローチすべてで〜4ミリ秒になりました。

リフレクターでプログラムを開くと、すべての呼び出しが次のようになっていることがわかります。 Foo((string) null);

したがって、最も読みやすいと思われるものを選択できます。ILはすべてまったく同じになります。

于 2012-09-19T00:53:14.413 に答える