1
var addr = (from s in context.Addresses
            where (s.u_address_id == new Guid(this.Id).ToString("B"))
             select s).Single();    
Address Addr = new Address(addr.u_address_id);

次のように、linq の結果を変数に直接呼び出すのではなく、変数に代入するコストはいくらですか?

Address Addr = new Address(((from s in context.Addresses
                             where (s.u_address_id == new Guid(this.Id).ToString("B"))
                             select s).Single()).u_address_id);
4

4 に答える 4

4

実行時間やスペースの消費にコストはかかりません。どちらの場合も、保管場所は短期間必要です。一部のスタック スロットまたはレジスタは、.Single()呼び出しの結果への参照を格納し、それをコンストラクタに渡すために一時的に使用されます。その後(変数を再度使用しないと仮定すると、これは非常に暗示されています)、必要ではなく、再利用できます(予定です)。

より関連性の高い要因は、読みやすさ、行の長さ、コーディング標準などです。

于 2012-08-29T18:20:01.603 に答える
2

なし。どちらも同じことを行いますが、そうでなければ隠されるローカルに名前を付けます。

あらゆる小さなコストを削減するのが好きなら、次のことを試してみませんか。

Address Addr = new Address((from s in context.Addresses
  where (s.u_address_id == new Guid(this.Id).ToString("B"))
  select s.u_address_id).Single());

すべてのフィールドを取得しないと、非常に小さなものから、ほとんど問題になるほどの小さなものまで、影響を与える可能性があります。

さらに良い:

string add_id = new Guid(this.Id).ToString("B");
if(context.Addresses.Count(s => s.u_address_id == add_id) != 1)
  throw new InvalidOperationException();
Address Addr = new Address(add_id);

(一部の情報源で.Where(s => s.u_address_id == add_id).Take(2).Count()は優れていますが、他の情報源ではそうではありません)。

または、そのようなアイテムがソースに存在すると確信できる場合は、次のようにすることができます。

Address Addr = new Address(new Guid(this.Id).ToString("B"));

どれも大規模なものではありませんが、一時的な名前を付けることよりもはるかに重要です。彼らも、私たちが進むにつれて、彼らが実際に何をしているのかについてますます明確になっていると思います。私は最後、最も読みやすいと考えています。

于 2012-08-29T18:42:12.537 に答える
1

コストの面では実際にはそれほど多くはありません。最初のケースでは、スタック上に1〜2ワードのメモリが少し長く使用されている可能性がありますが、コストの観点からはごくわずかです。読みやすさは2つの間で少し異なりますが、それは常に主観的なケースです。ここでは、2行でもう少し読みやすくなり、コードの1行あたりの作業量が少なければ、デバッグが少し簡単になる可能性があります。

于 2012-08-29T18:21:11.963 に答える
1

変数がコンパイラまたは JIT によって最適化されていないと仮定します。次に、4 バイトまたは 8 バイト (32 ビットまたは 64 ビット) を RAM またはレジスターに格納することについて心配し始めます。

それを、クエリがオンザフライで SQL に変換され、ネットワーク経由でデータベース サーバーに送信され、データベース サーバーによって解析され、データベース サーバーによって実行され、結果がネットワーク経由で送り返されるコードの残りの部分と比較してください。使用できるオブジェクトにマテリアライズされます。

その 4 バイトの割り当てについてまだ心配していますか? 私は違います。

于 2012-08-29T18:30:26.947 に答える