2

メソッドのローカル変数に割り当てずに、メソッド内で同じ入力パラメーターを使用することが適切かどうかを知る必要があります。次のコード ブロックでは、クエリをより明確に説明できます。

オプション 1: メソッド内で使用する入力パラメーター

public int SumValues(List<int> pLValues)
        {
            int _sum = 0;

            for (int i = 0; i < pLValues.Count; i++)
            {
                _sum = +pLValues[i];
            }

            return _sum;
        }

オプション 2: ローカル変数に割り当て、それをメソッド内で使用します。

public int SumValues(List<int> pLValues)
{
    int _sum = 0;
    List<int> _lVal = pLValues;

    for (int i = 0; i < _lVal.Count; i++)
    {
        _sum = +_lVal[i];
    }

    return _sum;
}

最善の方法とその理由を教えてください。

4

2 に答える 2

7

別のローカル変数を宣言する利点はありません。そうしないでください。(パラメーターは、最初から確実に割り当てられている単なるローカル変数と考えてください。)

パラメータがrefあり、値を変更したくない場合は、それを新しいローカル変数にコピーするのが理にかなっています。もちろん、後で元の値が必要な場合も同様です。

ただし、コードにさまざまな変更を加える必要があります。

  • もちろん、最初はLINQのSumメソッドを使用します:)
  • 変数用に持っている接頭辞を捨てます
  • おそらく入力タイプを次のように変更しますIEnumerable<int>
  • foreachインデックスによるフェッチの代わりにループを使用します
于 2012-11-19T17:35:30.387 に答える
3

あなたの場合_lValはまったく同じです と同じオブジェクトpLValuesです。

C# は参照セマンティクスを使用します。それはあなたがするときです

_lVal = pLValues;

_lValは と同じオブジェクトへの参照であり、pLValuesによって参照されるオブジェクトに加えた変更は_lValを通じて観察可能であると述べていpLValuesます。

あれは

_lVal.Add(int.MaxValue);
if(pLValues.Last() == int.MaxValue){
   //this will be true because the element added in the first line
   //is added to the object that both _lVal and pLValues references
}

パラメーターの型が ValueType (int など) の場合も問題ではありませんが、別の理由があります。どの代入もコピー代入になるため、引数はメソッド呼び出しに渡されたもののコピーとして存在します。コピーのスコープはメソッドと同じです (一般的なケースでは、引数を閉じるなどの奇妙なケースがあります)。

したがって、最終的に短い答えは次のとおりです。パラメータがいつ使用されるかが明らかではないため、読みやすさしか得られないため、ローカル変数を作成しないこともできます

于 2012-11-19T17:35:43.133 に答える