“out”参数在.NET中是一件坏事吗?关于这个主题的任何好的文章/讨论?
答案 0 :(得分:49)
好吧,我有an article on what ref/out do - 但它没有讨论你是否应该使用它们。
基本上out
参数通常表示您希望从方法中有效返回两个结果。这通常是代码味道 - 但是在某些情况下(最值得注意的是使用TryXXX模式)你真正想要返回两条信息是有充分理由的,并且封装它们没有多大意义在一起。
换句话说,避免退出/参考你可以轻松做到的地方,但不要大规模地避开它们。
答案 1 :(得分:6)
对于大多数情况,我建议不要使用Out参数。它们基本上会为代码添加副作用,在调试时可能会成为一场噩梦。
MSDN上有一篇关于Out参数的文章:http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx
答案 2 :(得分:4)
在没有元组的情况下,它们有时是最干净的做事方式。不过,我一般都讨厌他们。
F#有一些很好的语法糖来处理它们。它不是让我处理out
参数,而是将它们视为返回元组的方法。各种TryParse
方法最终返回两个元素元组:
let success, value = Int32.TryParse("1234")
(* success is true *)
(* value is 1234 *)
它非常方便,并且不会让我觉得很脏。
答案 3 :(得分:1)
我认为它们在需要时非常有用。
关于ref和out参数的Msdn文章。
答案 4 :(得分:0)
好问题。我的答案是我并不特别喜欢它们,但我确实在我的一个项目中使用它们,其中多个返回值很常见。我有一个财务数据库,它返回实际价格(或null /零),主要错误代码和次要错误代码。该库有数十种到数百种方法,每种错误代码都是不同的类型,因此为每种方法创建自定义类并返回其中的实例将非常笨拙。
答案 5 :(得分:-1)
FxCop认为这不是一个好主意......
http://msdn.microsoft.com/en-us/library/ms182146(VS.80).aspx
答案 6 :(得分:-1)
当您需要因函数返回多个对象时,Out参数非常有用。对我而言,
void doSomeThing(Thing toDoItTo,
out OtherThing result1,
out AnotherThing result2)
{
...
}
OtherThing y;
AnotherThing z;
doSomeThing(x, out y, out z);
y.method1();
z.method2();
比
更清洁struct DoSomeThingResults
{
public OtherThing Result1;
public OtherThing Result2;
}
DoSomeThingResults doSomeThing(Thing toDoItTo)
{
...
}
DoSomethingResults results = doSomeThing(x);
results.Result1.method1();
results.Result2.method2();
此外,使用输出参数意味着保证分配结果。
答案 7 :(得分:-2)
使用Out
并不是一件坏事 让我们试着预防好处: using ref force us to initialize it so we are letting the ref variable to place in heap and consume some spaces .
in most cases we return null if the operation has some none logic conditions
but with Out we avoid consuming the heap and refspace