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 回答