web-dev-qa-db-ja.com

foreachループの内部または外部で変数を宣言する:どちらが速い/良いですか?

これらのどれがより速く/より良いものですか?

これです:

List<User> list = new List<User>();
User u;

foreach (string s in l)
{
    u = new User();
    u.Name = s;
    list.Add(u);
}

またはこれ:

List<User> list = new List<User>();

foreach (string s in l)
{
    User u = new User();
    u.Name = s;
    list.Add(u);
}

私の初心者の開発スキルは、最初のスキルが優れていることを教えてくれますが、私の友人は私に間違っていると言っていますが、2番目のスキルが優れている理由を教えてくれませんでした。

パフォーマンスに何か違いはありますか?

81
Marcus

パフォーマンスに関しては、両方の例が同じILにコンパイルされているため、違いはありません。

後者は、uがループ内でのみ使用される場合に意図をより明確に表現するため、より優れています。

99
dtb

いずれにしても、最良の方法は、Name ...をとるコンストラクタを使用することです。そうでなければ、中括弧表記を活用します。

foreach (string s in l)
{
    list.Add(new User(s));
}

または

foreach (string s in l)
{
    list.Add(new User() { Name = s });
}

さらに良いことには、LINQ:

var list = l.Select( s => new User { Name = s});

さて、最初の例は知覚できないほど速い場合もありますが、2番目の例は読みやすいので優れています。コンパイラはforeach範囲。

14
Tordek

宣言によってコードが実行されることはないため、パフォーマンスの問題ではありません。

2番目の方法はあなたの言うことであり、2番目の方法で行うと愚かなエラーを犯す可能性は低いので、それを使用します。常に、必要な最小のスコープで変数を宣言してください。

さらに、より良い方法はLinqを使用することです。

List<User> users = l.Select(name => new User{ Name = name }).ToList();
6
Mark Byers

パフォーマンスについて質問があるときはいつでも、測定するだけです。テストの周りでループを実行し、時間を計ります。

あなたの質問に答える-測定せず:-)または生成されたilasmを見ること-有意な数の反復とコードで最も費用のかかる操作では違いは目立たないでしょう。そのため、コードの明確性に集中し(一般的にはそうするべきです)、2に進みます。

ああ、遅くて、私はこの種のことを心配しないでください、またはこのような詳細に巻き込まれないと言っているだけだと思います。

K

5
Kevin Shea

2番目の方が優れています。各反復で新しいユーザーを持つことを意味しています。

1
Jarrett Widman

技術的には、新しい変数を割り当てるためにスタックフレームを移動する必要がないため、最初の例では数ナノ秒を節約できますが、これは気づかないほど小さなCPU時間であり、コンパイラがそうしない場合ですとにかく違いを最適化します。

1

このシナリオでは、2番目のバージョンの方が優れています。

一般に、反復の本体内の値にアクセスする必要がある場合は、2番目のバージョンを選択します。一方、最終状態がある場合、変数はループの本体を超えて保持され、最初のバージョンを使用して宣言します。

1
csj

パフォーマンスに目に見える違いはありません。

0
Jacob Adams
0
Sunil