哪个更好,使用可空或布尔返回+输出参数

Ore*_*zor 6 c# coding-style

假设我有一个需要返回一些整数值的函数.但它也可能失败,我需要知道它什么时候发生.

哪种方式更好?

public int? DoSomethingWonderful()
Run Code Online (Sandbox Code Playgroud)

要么

public bool DoSomethingWonderful(out int parameter)
Run Code Online (Sandbox Code Playgroud)

这可能更像是一个风格问题,但我仍然很好奇人们会采取哪种选择.

编辑:澄清,这段代码与一个黑盒子对话(我们称之为云.不,黑盒子.不,等等.云.是的).我不在乎为什么失败了.我只需要知道我是否有有效值.

Man*_*anu 12

我更喜欢可空版本,因为你可以使用null coalesce运算符?? 在它上面,例如:

int reallyTerrible = 0;
var mightBeWonderful = DoSomethingWonderful() ?? reallyTerrible;
Run Code Online (Sandbox Code Playgroud)

  • 哇!!!!我刚刚在一个SO答案中抢占了Jon Skeet!今晚我将无法入睡! (4认同)
  • 正是我要写的.它还意味着如果您不需要它,则不需要声明单独的变量.基本上它允许更流畅的表达. (2认同)

Ste*_*ger 5

这取决于您认为调用代码应该如何.因此,您的功能用于什么.

一般来说,你应该避免争论.另一方面,拥有这样的代码可能会很好:

int parameter;
if (DoSomething(out paramameter))
{
  // use parameter
}
Run Code Online (Sandbox Code Playgroud)

当你有一个可以为null的int时,它看起来像这样:

int? result = DoSomething();
if (result != null)
{
  // use result
}
Run Code Online (Sandbox Code Playgroud)

这有点好,因为你没有out参数,但决定函数是否成功的代码看起来不是很明显.

不要忘记还有另一种选择:使用Exeptions.只有当你的函数失败的情况真的是一个例外和一种错误情况时才这样做.

try
{
  // normal case
  int result = DoSomething()
}
catch (SomethingFailedException ex)
{
  // exceptional case
}
Run Code Online (Sandbox Code Playgroud)

该例外的一个优点是你不能忽略它.正常情况也很容易实施.如果您可以忽略特殊情况,则不应使用例外.

编辑:忘记提及:异常的另一个优点是您还可以提供操作失败的原因信息.此信息由Exception类型,Exception的属性和消息文本提供.