C# 在方法中使用输入参数是一种好的做法吗
我需要知道,在方法中使用相同的输入参数而不将它们分配给方法局部变量是否是一种好的做法。下面的代码块可以更清楚地描述查询 选项1:方法内部使用的输入参数C# 在方法中使用输入参数是一种好的做法吗,c#,C#,我需要知道,在方法中使用相同的输入参数而不将它们分配给方法局部变量是否是一种好的做法。下面的代码块可以更清楚地描述查询 选项1:方法内部使用的输入参数 public int SumValues(List<int> pLValues) { int _sum = 0; for (int i = 0; i < pLValues.Count; i++) { _sum
public int SumValues(List<int> pLValues)
{
int _sum = 0;
for (int i = 0; i < pLValues.Count; i++)
{
_sum = +pLValues[i];
}
return _sum;
}
public int SumValues(列出pLValues)
{
int _sum=0;
对于(int i=0;i
选项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;
}
public int SumValues(列出pLValues)
{
int _sum=0;
列表_lVal=PLV值;
对于(int i=0;i<\u lVal.Count;i++)
{
_总和=+_lVal[i];
}
返回(u)和;;
}
请告诉我最好的方法是什么以及为什么?声明另一个局部变量没有好处,所以不要这样做。(将一个参数看作是一个局部变量,它肯定是从一开始就指定的。) 如果您有一个
ref
参数,并且不想更改该值,那么将其复制到一个新的局部变量中是有意义的,这是无可否认的。当然,如果以后需要原始值,也是如此
但是,我会对您的代码进行各种更改:
- 首先,我会使用LINQ的
方法,当然:)Sum
- 我会放弃变量的前缀
- 我可能会将输入类型更改为
IEnumerable
- 我会使用
循环,而不是通过索引获取foreach
完全相同\u lVal
是与pLValues
相同的对象
C#使用引用语义。那就是你做的时候
_lVal = pLValues;
您声明\u lVal
是对与pLValues
相同对象的引用,您对\u 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),那么这也无关紧要,但有其他原因。因为任何赋值都将是一个副本赋值,并且参数用于传递给方法调用的内容的副本。副本的范围与方法相同(在一般情况下,存在奇数情况,例如结束参数)
因此,最终的简短答案是。您也可以不创建局部变量,因为您只能获得松散的可读性,因为现在使用参数时它不明显,只要以后在方法中不重新分配它。保留新实例的变量。@JeffMercado:老实说,我不确定你的意思。我在看很多遗留代码,他们经常这样做。变量被大量重用(多次用于完全不同的用途),这让我抓狂我想说的是,应该为每一种不同的用途声明一个变量。@JeffMercado:是的,这很公平——但这肯定会扩展到参数本身,不是吗?如果您使用一个参数,但将其用于两个不同的目的,那么这听起来像是一个问题。感谢JonSkeet,我只想为查询生成一个示例,所以不必担心代码@当我们为每个应用声明不同的变量时,代码不会有大量的内存分配而没有任何用途吗?你应该考虑查看C命名约定。你的函数也不起作用。code>SumValues(new List(){1,1})返回
1
而不是2
它应该是\u sum+=\u lVal[i]代码>我不会这样谈论别名-这两个变量不是别名,它们只是具有相同的值。更改\u lVal
本身在pLValues
中不可见,但是如果更改\u lVal
的值所引用的对象内的数据,无论您如何访问该对象,该更改都将可见。是的@JonSkeet youe是对的,它们是两个不同的引用。我将更新如果我们除了传递基元列表之外还传递引用数据类型列表会怎么样?@user1249197对参数没有影响