在C#中使用"out"关键字的最佳做法

19 .net c#

我正在尝试将c#中"out"关键字的使用形式化为我正在使用的项目,特别是对于任何公共方法.我似乎无法找到任何最佳实践,并想知道什么是好的或坏的.

有时我看到一些方法签名看起来像这样:

public decimal CalcSomething(Date start, Date end, out int someOtherNumber){}
Run Code Online (Sandbox Code Playgroud)

在这一点上,这只是一种感觉,这并不适合我.出于某种原因,我更愿意看到:

public Result CalcSomething(Date start, Date end){}
Run Code Online (Sandbox Code Playgroud)

其中结果是包含小数和someOtherNumber的类型.我认为这使得阅读更容易.它允许扩展Result或添加属性而不会破坏代码.这也意味着此方法的调用者不必在调用之前声明本地作用域"someOtherNumber".根据使用期望,并非所有呼叫者都会对"someOtherNumber"感兴趣.

相比之下,我现在可以在.Net框架中考虑"out"参数有意义的唯一实例是TryParse()等方法.这些实际上使调用者编写更简单的代码,因此调用者主要对out参数感兴趣.

int i;
if(int.TryParse("1", i)){
  DoSomething(i);
}
Run Code Online (Sandbox Code Playgroud)

我认为只有在返回类型为bool时才会使用"out",并且预期的用法是调用者总是对"out"参数感兴趣的设计.

思考?

peS*_*HIr 21

当您使用out参数时,有一个原因是静态代码分析(= FxCop)规则指向您.我会说:只有out在互操作类型场景中真正需要时才使用.在所有其他情况下,根本不使用out.但也许那只是我?


Mit*_*eat 15

这是.NET Framework Developer's Guide关于参数的说法:

避免使用输出或参考参数.

使用定义或引用参数的成员需要开发人员理解指针,值类型和引用类型之间的细微差别,以及out和reference参数之间的初始化差异.

但如果你确实使用它们:

在所有pass-by-value和ref参数(不包括参数数组)之后放置所有参数,即使这会导致重载之间的参数排序不一致.

此约定使方法签名更容易理解.

  • 所以开发人员指南基本上说你不应该使用参数,因为大多数开发人员太愚蠢,无法理解他们所选语言的一个非常基本的方面! (20认同)

Gio*_*lbo 6

你的方法比出更好,因为你可以通过这种方式"链接"调用:

DoSomethingElse(DoThing(a,b).Result);
Run Code Online (Sandbox Code Playgroud)

而不是

DoThing(a, out b);
DoSomethingElse(b);
Run Code Online (Sandbox Code Playgroud)

用"out"实现的TryParse方法是一个错误,IMO.这些在链条上会非常方便.

  • 好吧,你需要一种方法来判断解析是否成功. (2认同)
  • 对于链接,使用`int.Parse()`,或传递未解析的字符串.我不知道如何在不使用`out`参数的情况下获得`TryParse()`功能. (2认同)

Tre*_*reb 5

我只会在极少数情况下使用out. 其中之一是,如果您的方法返回两个从面向对象的角度来看不属于同一个对象的变量。

例如,如果您想要获取文本字符串中最常见的单词以及文本中的第 42 个单词,您可以使用相同的方法计算这两个单词(只需解析文本一次)。但对于您的应用程序来说,这些信息彼此没有关系:出于统计目的,您需要最常用的单词,但您只需要第 42 个单词,因为您的客户是道格拉斯·亚当斯 (Douglas Adams) 的极客粉丝。

是的,这个例子做作,但我没有更好的例子......