我正在尝试将c#中"out"关键字的使用形式化为我正在使用的项目,特别是对于任何公共方法.我似乎无法找到任何最佳实践,并想知道什么是好的或坏的.
有时我看到一些方法签名看起来像这样:
public decimal CalcSomething(Date start, Date end, out int someOtherNumber){}
在这一点上,这只是一种感觉,这并不适合我.出于某种原因,我更愿意看到:
public Result CalcSomething(Date start, Date end){}
其中结果是包含小数和someOtherNumber的类型.我认为这使得阅读更容易.它允许扩展Result或添加属性而不会破坏代码.这也意味着此方法的调用者不必在调用之前声明本地作用域"someOtherNumber".根据使用期望,并非所有呼叫者都会对"someOtherNumber"感兴趣.
相比之下,我现在可以在.Net框架中考虑"out"参数有意义的唯一实例是TryParse()等方法.这些实际上使调用者编写更简单的代码,因此调用者主要对out参数感兴趣.
int i; if(int.TryParse("1", i)){ DoSomething(i); }
我认为只有在返回类型为bool时才会使用"out",并且预期的用法是调用者总是对"out"参数感兴趣的设计.
思考?
当您使用out
参数时,有一个原因是静态代码分析(= FxCop)规则指向您.我会说:只有out
在互操作类型场景中真正需要时才使用.在所有其他情况下,根本不使用out
.但也许那只是我?
这是.NET Framework Developer's Guide关于参数的说法:
避免使用输出或参考参数.
使用定义或引用参数的成员需要开发人员理解指针,值类型和引用类型之间的细微差别,以及out和reference参数之间的初始化差异.
但如果你确实使用它们:
在所有pass-by-value和ref参数(不包括参数数组)之后放置所有参数,即使这会导致重载之间的参数排序不一致.
此约定使方法签名更容易理解.
你的方法比出更好,因为你可以通过这种方式"链接"调用:
DoSomethingElse(DoThing(a,b).Result);
而不是
DoThing(a, out b); DoSomethingElse(b);
用"out"实现的TryParse方法是一个错误,IMO.这些在链条上会非常方便.