2009-06-23 5 views
0

どちらが正しいアプローチであり、なぜですか?ループが完了した後ループ内の変数を再初期化する正しい場所はどこですか?

string initializeme = string.Empty; 
StringBuilder AppendToMe = new StringBuilder(); 

for(int i=0; i < 10; i++) 
{ 
    initializeme = string.Empty; //Is this the right place to initialize? 

    if(expressionThatEvalsTrue) 
     initializeme = SomeMethodReturningString(); 

    if(!string.IsNullOrEmpty(initializeme) 
     AppendToMe.Append(initializeme); 
} 

または

string initializeme = string.Empty; 
StringBuilder AppendToMe = new StringBuilder(); 

for(int i=0; i < 10; i++) 
{ 
    if(expressionThatEvalsTrue) 
     initializeme = SomeMethodReturningString(); 

    if(!string.IsNullOrEmpty(initializeme) 
     AppendToMe.Append(initializeme); 

    initializeme = string.Empty; //Is this the right place to initialize? 

} 
+0

2番目のケースでは、 "for(int i = 0; i <10; i ++、initializeme = string.Empty)"(これもC#でも可能な場合) 。 – schnaader

+0

@Nick - 'expressionThatEvalsFalse'の全体は、式が真と評価された場合にパスが実際に選択されるので混乱します。私はこの例が考案されていることに気がついていますが、変数の名前をどのように指定するか慎重にしたいと考えています。私は最初、私を怒らせました - 私は評価の感覚ではなく変数の名前を持って行きました。 – tvanfosson

+0

@tvanfosson - 変更しました。ありがとうございます。 – Developer

答えて

0

あなたはこの変数を使用するのでしょうか?私が見ることができる唯一の違いは、その変数の最後の値を保持する必要がある場合、最初の変数は2番目の変数を保持していないことです。

+1

いいえループが完了した後に変数を使用しない – Developer

5

3つの要因がここにあります

  • あなたはラムダ式や匿名メソッドを使用してループ内の変数をキャプチャするつもりですか?その場合は、の単一変数をキャプチャするか、繰り返しごとに1つずつキャプチャしますか?
  • ループの後に値が必要ですか?
  • ループの次の反復で現在の値が必要ですか?

私は一般的に可能な最小のスコープ内の変数を宣言すると、すぐにそれらを初期化しよう:

for(int i=0; i < 10; i++) 
{ 
    string initializeme = expression ? SomeMethodReturningString() : "";  
    Console.WriteLine(initializeme);  
} 
+0

この場合、全体をインライン化するのはなぜですか? Console.WriteLine(expression?SomeMethodReturningString(): ""); –

+0

string.Emptyの代わりに空の文字列を ""で表すことを選択したことに興味があります。あなたがこれをする理由がありますか? – Developer

+0

うーん... *おそらく* - しかし、私はここで余分な変数は、この場合は少し読みやすくすると思います。 –

1

行うための最善の方法、それはこのようなものです:

for (int i = 0; i < 10; i++) 
{ 
    string initializeme = string.Empty; 
    if (expressionThatEvalsFalse) 
     initializeme = SomeMethodReturningString(); 

    Console.WriteLine(initializeme); 
} 

あなたが使用している場合initializemeがループ外にある場合は、ループ外で宣言する必要があります。

3

私はこれを好む:

for(int i=0; i<10; i++) 
{ 
    var initializeme = expression 
         ? SomeMethodReturningString() 
         : string.Empty; 
    Console.WriteLine(initializeme); 
} 

を、私はこのスタイルを好む理由は、それが自己完結していることです:変数が一つだけの場所に設定されています。ループ内で実行すると、変数のスコープも小さくなります。これもまた好ましいものです。三項演算子をパラメータIMOとして使用すると、関数呼び出しの読みやすさが低下するため、この場合は余分な変数を使用するのが好きです。

1

私は、ループ内で変数を宣言すると、コンパイラは、このから遅いコードを作成しないように十分にスマートであることを前提としています:

for(int i=0; i<10; i++) 
{ 
    string initializeme = string.Empty; 
    if(expressionThatEvalsFalse) 
     initializeme = SomeMethodReturningString(); 

    Console.WriteLine(initializeme); 
} 
+0

+1;まさに私が言うつもりだった(しかし、49秒も早い!) –

2

現代のコンパイラは、すべての変数がある中で、静的単一代入にコードを変換します正確に1回割り当てられているので、ループの各繰り返しのように、都合の良いときに新しい変数を宣言しないという言い訳はありません。

0

コードスニペットでは、私は最初に初期化する必要はありません。 2つのスニペットは、initializemeが値(スニペット1)または空の文字列(スニペット2)に初期化されるループの後で異なります。以下のコードのプレミスは、ループ内のinitializerを必要とすることです。

StringBuilder AppendToMe = new StringBuilder(); 
for(int i=0; i < 10; i++) 
{  
    if(expressionThatEvalsTrue) 
     AppendToMe.Append(SomeMethodReturningString());   
} 
0

私の意見でもどちらの場合も、私は次のことを行います。

それが空白に設定されますothewiseあなたexpressionThatEvalsTrueは、あなたがメソッドから文字列を取得真である場合

initializeme = expressionThatEvalsTrue ? 
    SomeMethodReturningString() : string.Empty 

この方法では

initializeme = string.Empty; //Is this the right place to initialize? 

if(expressionThatEvalsTrue) 
    initializeme = SomeMethodReturningString(); 

を交換してください。

関連する問題