私は C# と .NET を学んでvar
おり、コードでキーワードを頻繁に使用しています。このアイデアは Eric Lippert から得たもので、コードの保守性が向上する点が気に入っています。
私は不思議に思っています...遅いヒープに位置する参照についてブログに多く書かれていますが、私はこれを自分で観察していません。これは実際に遅いですか?型推論によるコンパイル時間の遅さについて言及しています。
あなたは次のように述べています:
タイプ「推論」が原因でコンパイルに時間がかかることを指しています
これにより、コンパイラの速度が低下することはありません。コンパイラは、割り当ての互換性 (直接または間接) をチェックするために、式の結果の型を既に認識している必要があります。いくつかの点で、この既知の型を使用すると、いくつかのことが取り除かれます (たとえば、継承、インターフェイス、および変換演算子をチェックする必要がある可能性があります)。
また、ランタイムが遅くなることもありません。それらは、通常の c# 変数のように完全に静的にコンパイルされます (そうです)。
要するに...そうではありません。
C# の 'var' は、VB で慣れているような VARIANT ではありません。var は、コンパイラーが型を簡略化するために使用できる単なる構文糖衣です。コンパイラは式の右側の型を判断し、変数をその型に設定します。パフォーマンスへの影響はまったくありません。完全な型式を入力した場合と同じです。
var x = new X();
とまったく同じ
X x = new X();
これは些細な例のように思えますが、実際にそうです。これは、式がはるかに複雑であるか、「表現できない」(匿名型のように) および列挙可能な場合に本当に役立ちます。
Var は、コンパイル時に実際の変数の型に置き換えられます。あなたは考えていdynamic
ますか?
「バリアント」は型がないため、状態へのアクセス (または内部状態の変換) は常に次の 2 つの手順を実行する必要があります。(1) 「実際の」内部型を決定し、(2) その「実際の」内部型から関連する状態を抽出します。 .
型付きオブジェクトから開始する場合、そのような 2 段階のプロセスはありません。
確かに、「バリアント」にはこの追加のオーバーヘッドがあります。適切な使用法は、ほとんどのスクリプト言語や非常に高レベルの API で行われるように、コードを簡素化するために any-type の利便性が必要な場合です。そのような場合、多くの場合、「バリアント」のオーバーヘッドは重要ではありません (とにかく高レベルの API で作業しているため)。
しかし、あなたが " var
" について話しているのであれば、それはあなたが「コンパイラ、ここに適切な型を入れてください」と言うための便利な方法にすぎません。それを理解してください。その場合、" var
" は (実行時の) "バリアント" を表すのではなく、単なるソース コード仕様の構文を表します。
コンパイラは、コンストラクターから型を推測します。
var myString = "123";
と変わらないstring myString = "123";
また、一般的に言えば、var を使用して宣言されているかどうかに関係なく、参照型はヒープ上に存在し、値型はスタック上に存在します。