38

上司varは、アプリの動作が遅くなったり遅くなったりするため、使用を禁止しています。

本当?

4

6 に答える 6

52

うまくいく可能性のあるアプローチは、次の 2 つのメソッドを記述することです。

public static void WithInt()
{
    int x = 5;
    Console.WriteLine(x);
}

public static void WithVar()
{
    var x = 5;
    Console.WriteLine(x);
}

コンパイルildasmし、生成された CIL を調べるために使用します。上司に見せてください。

編集 @ck は最後のステップを除いてすべて完了しました:)

于 2010-08-24T10:54:15.107 に答える
37

Aakash の回答に続いて、ここに IL があります: (ありがとうLINQPad )

WithInt:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret         

WithVar:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret      
于 2010-08-24T12:37:04.117 に答える
32

それはまったく真実ではありません。

var「親愛なるコンパイラ、私は型が何であるかを知っています。あなたもそうです。それでは、先に進みましょう」という意味です。

これによりコードが短くなり、読みやすくなる人もいます (読みにくいと感じる人もいます) が、パフォーマンスが低下することはありません。

于 2010-08-24T10:52:40.927 に答える
32

頭の悪い上司に呪われる人が多いのはなぜですか?革命、兄弟!

あなたの上司はドキュメントを読む必要があります。varコンパイラは、初期化式の静的な型を調べて変数の型を判断します。型を手動で指定するか、使用varしてコンパイラに認識させるかにかかわらず、実行時にわずかな違いはありません。

更新質問の下のコメントで、Hans Passant が尋ねる

キャストを使用せずにボクシングを引き起こす var 初期化子を考えられますか?

このような変換を強制する自己完結型の式の例は次のとおりです。

var boxedInt = new Func<int, object>(n => n)(5);

しかし、それは以下とまったく同じです:

object boxedInt = new Func<int, object>(n => n)(5);

つまり、これは実際には何の関係もありませんvar。私のイニシャライザ式の結果はobjectであるため、それvarを変数の型として使用する必要があります。それ以外にはありえませんでした。

于 2010-08-24T10:49:48.047 に答える
10

あなたの上司は、型に慣れている古い Visual Basic (<= 6.0 など) のプログラマかもしれませんVARIANTDIMステートメントで変数の型を明示的に指定しなかった場合、それは、私が正しく思い出せばVARIANT一種の でした。unionこのような変数を関数に渡すとき、これを一種の「ボックス化」および「ボックス化解除」と見なすことができます。

時々人々は混乱します。上司に Visual Basic の戦争体験談について尋ねてください。聞いて、学んで、同時に共感を得ましょう!オフィスを離れるときに、C# コンパイラがコンパイル時にこのようなことを把握し、"ボクシング" はもはや問題ではないことを指摘できます。

上司が言語/API の最新の変更についていく必要があるとは思わないでください。これはばかげているということではありません。他にやるべきことがあるということです。たとえば、彼の仕事。

編集:ただし、以下のコメントに記載されているようvarに、間違った理由で使用しないように指示することは、おそらく彼の仕事ではありません...

于 2010-08-24T13:02:12.677 に答える