我正在尝试在c#中为我正在进行的一个项目正式化"out“关键字的用法,特别是在任何公共方法方面。我似乎找不到任何最佳实践,我想知道什么是好的,什么是坏的。
有时我会看到一些方法签名看起来像这样:
public decimal CalcSomething(Date start, Date end, out int someOtherNumber){}在这一点上,这只是一种感觉,这对我来说并不合适。出于某些原因,我更愿意看到:
public Result CalcSomething(Date start, Date end){}其中,结果是包含小数和someOtherNumber的类型。我认为这让它更容易阅读。它允许在不破坏代码的情况下扩展结果或添加属性。这也意味着这个方法的调用者在调用之前不必声明一个本地作用域的"someOtherNumber“。从使用预期来看,并不是所有的调用者都会对"someOtherNumber“感兴趣。
相比之下,我现在能想到的在.Net框架中唯一有意义的"out“参数实例是在TryParse()这样的方法中。这实际上使调用者编写更简单的代码,从而调用者主要对out参数感兴趣。
int i;
if(int.TryParse("1", i)){
DoSomething(i);
}我认为只有当返回类型是bool,并且预期的用法是调用者总是对"out“参数感兴趣的地方时,才应该使用"out”。
有什么想法?
发布于 2009-01-05 14:22:42
当您使用out参数时,有一个静态代码分析(=FxCop)规则指向您是有原因的。我要说的是:只有在互操作类型的场景中真正需要的时候才使用out。在所有其他情况下,请不要使用out。但也许那只是我?
发布于 2009-01-05 14:51:10
下面是.NET Framework Developer's Guide对out参数的说明:
避免使用out或reference参数。
使用定义out或reference参数的成员要求开发人员了解指针、值类型和reference类型之间的细微差异以及out参数和reference参数之间的初始化差异。
但是如果你使用them
会将所有输出参数放在所有按值传递和引用参数(不包括参数数组)之后,即使这会导致重载之间的参数排序不一致。
此约定使方法签名更易于理解。
发布于 2009-01-05 14:29:06
你的方法比out更好,因为你可以这样“链”调用:
DoSomethingElse(DoThing(a,b).Result);而不是
DoThing(a, out b);
DoSomethingElse(b);使用"out“实现的TryParse方法是一个错误。这些在链条中是非常方便的。
https://stackoverflow.com/questions/413218
复制相似问题