有没有一种方法可以省略输出参数?

41
假设我有一个带有“out”参数的函数,但我不需要它的值。如果给定的结果将被丢弃,是否有一种方法可以不传递实际参数? 编辑: 尽管该问题被投票为可选输出参数的重复,但如果你从方法使用者的角度看,这只有在方法创建者的角度才是如此。你对这个参数不感兴趣,只是不想在声明变量的情况下使用它。虽然这是不可能的,但是使用C#7.0,在方法调用中声明它是可能的。所以,代替:
int unusedValue;
TryGetValue("key", out unusedValue);

你将得到:

TryGetValue("key", out int unusedValue);

或者甚至更好:

TryGetValue("key", out _);

这个答案应该被添加上去,但是:

  • 我不能在这个问题上添加答案,因为它已经被标记为重复;
  • 这个问题所标记的重复问题实际上请求的是另一件事情。
3个回答

26

你不能这样做,但是并没有规定你必须使用返回的值。你可以简单地传递一个您不再使用的临时变量。

C# 4.0允许可选参数,但out参数不能是可选的。

编辑:另外,您还可以重载该方法:

int DoStuff()
{
    int temp;
    return DoStuff(out temp);
}

int DoStuff(out outParam)
{
    //...
}

好的,我知道我不必使用它。我也不想传递任何变量。然而这就是答案,谢谢。 - konrad.kruczynski

7

虽然你实际上不能使 out 参数可选,但你可以为该函数创建一个重载版本,不包含 out 参数,这样就不需要创建临时变量了。

public void DoSomething(int param1, out int param2)
{
    /* Method work here */
}

public void DoSomething(int param1)
{
    int temp;
    DoSomething(param1, out temp);
}

编辑:现在使用discards来处理未使用的变量是理想的(特定于out的文档),因为这样你可以向自己/其他开发人员传达你有意忽略该变量。你也可以将未使用的变量内联。而且,为什么不使用lambda语法呢。

public void DoSomething(int param1) => DoSomething(param1, out _);

这几乎消除了完全隐藏 out 参数的重载需求,因为在您的调用代码中,您可以使用 out int _ 一行代码调用该方法。


这个答案更具有功能性。如果您想要使用它或不再使用它,以后无需进行修改。 - elcool
如果您不拥有您正在调用的方法,您可以创建一个扩展方法来为您虚假输出参数。 - Preston McCormick

0
不确定C#,但在VB.Net中,您可以简单地将常量传递给输出(按引用)参数。因此,如果您有一个整数作为输出参数,您不必传递实际变量,只需传递0或任何其他有效整数即可。对于对象,包括字符串,您可以只传递Nothing(在C#中为Null),一切都能正常工作。我不确定变量存储在哪里,可能与您传递的任何其他参数一样放在堆栈上,并且在函数退出时消失。

我尝试了一下,不幸的是它没有起作用。error CS1510: ref或out参数必须是可分配的变量 - MasterMastic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接