gpt4 book ai didi

c# - 在什么情况下 'out' 参数有用(不能使用 'ref' 的情况)?

转载 作者:IT王子 更新时间:2023-10-29 04:46:26 24 4
gpt4 key购买 nike

据我所知,out 参数的唯一用途是调用者可以从单个方法调用中获取多个返回值。但是我们也可以使用 ref 参数来获取多个结果值!

那么在其他情况下,out 参数是否有用,而我们不能使用 ref 参数呢?

谢谢。

最佳答案

是的 - refout 之间的区别在于明确赋值:

  • out 参数不必必须在方法调用之前由调用者明确分配。它确实必须在它正常返回(即没有异常)之前在方法中明确分配。然后在调用之后明确地在调用者中分配变量。

  • ref 参数确实必须在方法调用之前由调用者明确分配。 不必在方法中为其分配不同的值。

假设我们想更改 int.TryParse(string, out int) 以使用 ref 代替。通常调用代码如下所示:

int value;
if (int.TryParse(text, out value))
{
// Use value
}
else
{
// Do something else
}

现在如果我们使用 ref,我们必须在调用之前给 value 一个值,例如:

int value = 0;
if (int.TryParse(text, ref value))
{
// Use value
}
else
{
// Do something else
}

显然这不是巨大 的区别 - 但它给人的印象是错误的。我们正在分配一个我们无意使用的值,这对可读性来说不是一件好事。 out 参数表示一个值从该方法中出来(假设没有异常)并且您不需要有一个值作为开始。

我为 C# 5 提出的一个建议(我不知道它是否会被采纳)是一个带有 out 参数的方法应该能够被视为作为返回值元组的方法。结合对元组的更好支持,这意味着我们可以做这样的事情:

var (ok, value) = int.TryParse(text);

在这种情况下,okvalue 将分别隐式类型化为 boolint。这样一来,进入方法的内容(文本)和输出的内容(两条信息:okvalue)一目了然。

如果 int.TryParse 使用 ref 参数代替,那将根本不可用 - 因为编译器无法知道它是否会实际 关心 ref 参数的初始值。

关于c# - 在什么情况下 'out' 参数有用(不能使用 'ref' 的情况)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128486/

24 4 0