上司var
は、アプリの動作が遅くなったり遅くなったりするため、使用を禁止しています。
本当?
うまくいく可能性のあるアプローチは、次の 2 つのメソッドを記述することです。
public static void WithInt()
{
int x = 5;
Console.WriteLine(x);
}
public static void WithVar()
{
var x = 5;
Console.WriteLine(x);
}
コンパイルildasm
し、生成された CIL を調べるために使用します。上司に見せてください。
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
それはまったく真実ではありません。
var
「親愛なるコンパイラ、私は型が何であるかを知っています。あなたもそうです。それでは、先に進みましょう」という意味です。
これによりコードが短くなり、読みやすくなる人もいます (読みにくいと感じる人もいます) が、パフォーマンスが低下することはありません。
頭の悪い上司に呪われる人が多いのはなぜですか?革命、兄弟!
あなたの上司はドキュメントを読む必要があります。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
を変数の型として使用する必要があります。それ以外にはありえませんでした。
あなたの上司は、型に慣れている古い Visual Basic (<= 6.0 など) のプログラマかもしれませんVARIANT
。DIM
ステートメントで変数の型を明示的に指定しなかった場合、それは、私が正しく思い出せばVARIANT
一種の でした。union
このような変数を関数に渡すとき、これを一種の「ボックス化」および「ボックス化解除」と見なすことができます。
時々人々は混乱します。上司に Visual Basic の戦争体験談について尋ねてください。聞いて、学んで、同時に共感を得ましょう!オフィスを離れるときに、C# コンパイラがコンパイル時にこのようなことを把握し、"ボクシング" はもはや問題ではないことを指摘できます。
上司が言語/API の最新の変更についていく必要があるとは思わないでください。これはばかげているということではありません。他にやるべきことがあるということです。たとえば、彼の仕事。
編集:ただし、以下のコメントに記載されているようvar
に、間違った理由で使用しないように指示することは、おそらく彼の仕事ではありません...