【发布时间】:2010-09-21 19:34:51
【问题描述】:
“out”参数在 .NET 中是不是一件坏事?关于这个主题有什么好的文章/讨论吗?
【问题讨论】:
-
这个问题很好讨论:stackoverflow.com/questions/214688/…
标签: .net
“out”参数在 .NET 中是不是一件坏事?关于这个主题有什么好的文章/讨论吗?
【问题讨论】:
标签: .net
在大多数情况下,我建议不要使用 Out 参数。它们基本上会给您的代码添加副作用,并且在调试时可能是一场噩梦。
MSDN 上有一篇关于 Out 参数的文章:http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx
【讨论】:
我认为它们在需要时非常有用。
关于 ref 和 out 参数的 Msdn 文章。
【讨论】:
嗯,我有an article on what ref/out do - 但它没有讨论你是否应该使用它们。
基本上out 参数通常表示您希望从一个方法有效地返回两个结果。这通常是一种代码异味——但在某些情况下(尤其是 TryXXX 模式),您出于充分的理由确实想要返回两条信息,而封装它们没有多大意义在一起。
换句话说,在你可以轻松做到的地方避免使用 out/ref,但不要为了避免它们而大费周章。
【讨论】:
好问题。我的回答是我不是特别喜欢它们,但我确实在我的一个项目中使用它们,其中多个返回值很常见。我有一个财务数据库,它返回实际价格(或空/零)、主要错误代码和次要错误代码。该库有几十到几百个方法,每个错误代码都是不同的类型,因此为每个创建自定义类并返回一个实例将非常笨拙。
【讨论】:
FxCop 认为这不是个好主意...
http://msdn.microsoft.com/en-us/library/ms182146(VS.80).aspx
【讨论】:
当您需要返回多个对象作为函数的结果时,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();
另外,使用out参数意味着保证结果被赋值。
【讨论】:
在没有元组的情况下,它们有时是最干净的做事方式。不过,我通常讨厌他们。
F# 有一些很好的语法糖来处理它们。它没有让我处理out 参数,而是将它们视为返回元组的方法。各种TryParse 方法最终返回两个元素元组:
let success, value = Int32.TryParse("1234")
(* success is true *)
(* value is 1234 *)
很方便,不会让我觉得脏。
【讨论】:
使用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
【讨论】: