实际上我正在做一个列表作为参考参数,如下所示:
public static List ListMethod(List result)
我也看到有些人也这样做了:
public static void ListMethod(ref List result)
如果我没错,“my”方法也会将list
作为参考参数,你应该可以像使用“其他”方法一样使用它。
但是对我来说,输入参数,对它做一些事情并在方法返回值中返回它似乎更“干净”。
支持或反对某种方法或其他方法的任何好的论据?
答案 0 :(得分:32)
可能您不需要使用ref
- 但 是差异。
通常当我看到人们使用ref
作为参考类型参数时,它是因为他们不了解参数传递的工作原理。但是如果你的方法有这样的东西:
result = new List();
...
然后在第一种情况下,调用者不会看到更改,而在第二种情况下,调用者的变量将被更改为引用新对象。
有关详细信息,请参阅我的article on parameter passing。
答案 1 :(得分:12)
不,您的方法不使用ref
参数。默认值为pass by value
。
不同之处在于,您的方法只能修改列表的内容,而不能修改参数result
指向的引用。
什么是最好的方法?这取决于你的方法应该做什么。
当您的方法修改列表或返回新数据时,您应该使用返回值。 除了使用ref参数之外,了解代码的功能要好得多。
返回值的另一个好处是能够使用方法链。
您可以编写这样的代码,将list参数从一个方法传递到另一个方法:
ListMethod1(list).ListMethod2(list)...
答案 2 :(得分:3)
如果你刚刚返回一个List,你应该总是使用第一个,因为它显示了意图。
带ref
的版本告诉我,我可以从列表中开始,您的方法将修改我发送的列表,甚至用另一个列表更改它。如果这是你的意图,那就去做吧。
但是如果方法总是返回一个新列表,则使用返回值而不是ref参数。
旁边的注释:您可以使用out
代替ref
来表示您返回新列表的意图,但这只是一个很好的做法,如果你'使用其他东西的返回值。
答案 3 :(得分:1)
关于ref参数的一个特别之处是 - “用ref传递的变量必须先赋值。”。因此,如果你想在调用之前对调用方法进行严格的赋值,你可以使用ref参数。