“out”参数在.NET中是一件坏事吗?

时间:2008-11-11 14:36:08

标签: .net

“out”参数在.NET中是一件坏事吗?关于这个主题的任何好的文章/讨论?

8 个答案:

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