1

在 C# 中使用 out 参数是否有任何实质性的副作用或缺点?我可以返回两个或更多对象吗?

我是 C# 新手,我从未通过参数返回方法的值。我认为当您需要返回超过 1 个对象时它非常有用,但我想确保这样做没有重大缺陷。

    static int doubleScore(out int i, int score)
    {
        return score*2;
    }
    static void Main()
    {
        int score = 10;
        int newScore = 0;

        doubleScore(out newScore, score);
        // newScore = 20
    }

相比:

    static int doubleScore(int score)
    {
        return score*2;
    }
    static void Main()
    {
        int newScore = 0;
        int score = 10;
        newScore = doubleScore(score);
        // newScore is now 20
    }
4

7 回答 7

3

痛点out

  • 你不能轻易链接方法
  • 您不能在 LINQ 查询中轻松使用此类方法(即,在使用 LINQint.TryParse将字符串列表转换为整数列表时尝试使用Select)以及一般的功能代码
  • out异步代码中的参数变得相当复杂
  • 使用var作为out参数传递的变量通常会导致“赋值但从未使用”警告(var resultOfTryParse = 1; int.TryParse("2", out resultOfTryParse)
  • 即使没有好的值可以分配,您也必须始终在函数中分配值(通常outParam = 0/null在方法的开头结束)

每当您觉得out需要时,请尝试返回包含所有返回值的自定义类 - 可能更有用。

于 2013-10-04T21:08:38.607 回答
2

使用out关键字通常是不得已的做法。

它使代码更难阅读,也更不灵活。例如,假设您要这样做:

int score = 10;
int doubledScore = doubleScore(score);
int quadroupledScore = doubleScore(doubledScore);

现在,如果您使用 out 参数...

int score = 10;
int doubledScore;
doubleScore(out doubledScore, score);
int quadroupledScore;
doubleScore(out quadroupledScore, doubledScore);

这更令人困惑。现在假设您有一个方法要使用嵌套函数作为参数调用:

int score = 10;
var message = String.Format("Your number is {0}.  When doubled it is {1}.", score, doubleScore(score));

使用 out 参数变为:

int score = 10;
int doubledScore;
doubleScore(out doubledScore, score);
var message = String.Format("Your number is {0}.  When doubled it is {1}.", score, doubledScore);

不太灵活,更冗长。

于 2013-10-04T20:48:41.747 回答
1

好吧,在这种特定情况下,使用out参数并不是很有用(因为您只返回一个值),并且它使代码的可读性降低。

但我想确保这样做没有重大失败

不,没有任何明显的缺点或副作用,但是在您可以使用out参数的地方有一些限制。例如,您不能在迭代器或异步方法中使用它们。

于 2013-10-04T20:45:40.080 回答
1

假设您修复了示例中的错误,则没有理由使用函数的“参数版本”。Out 的实用性有限,因为它只能用于从函数调用中返回“额外值”。如果您尝试返回大量值,该方法很快就会变得笨拙。这不是真正的编译器问题,也不是代码生成问题,只是使用起来很痛苦。

我总是会声明一个方法结果类来返回 3 个或更多值,例如

public class DoubleScoreResult
{
  double value {get; private set}
  bool success {get; private set}
  Exception ex {get; private set};
}

function DoubleScoreResult DoubleScore()
{
  var result = new DoubleScoreResult();

   ...

  return result;
}
于 2013-10-04T20:48:54.340 回答
1

主要缺点之一是out参数使代码的可读性表现力降低。参数用于将值接受到方法中,返回值是出来的。我个人宁愿将它们明确分开。

如果您想返回多个值或对象,那么更好(或者更简洁)的方法是将它们包装在另一个对象中。也许是一个元组或更明确的东西。

于 2013-10-04T20:51:32.643 回答
0

指出 out 参数何时有用的示例:

当您想尝试将字符串解析为整数时,out 参数很有用。

返回类型将是布尔值,说明解析是否成功。out 参数会将引用变量设置为解析后的整数。如您所见,它用于bool int.TryParse(string s, out int i).

于 2013-10-04T20:47:36.253 回答
0

主要缺点是在使用时,out您必须有一个显式命名的存储位置(即局部变量)来存储结果。当您返回一个值时,您可以编写函数调用,而无需将结果存储在命名变量中。举个例子:

Console.WriteLine(doubleScore(2));

对比

int result;
doubleScore(out result, 2);
Console.WriteLine(result);

它使代码更加冗长,并且在使用代码时需要使用会导致副作用的语句。这些因素使得该方法在例如 LINQ 查询中的使用变得更加困难。

于 2013-10-04T20:49:00.997 回答