如果要从方法获取值,则可以使用两个返回值之一,如下所示:
public int GetValue();
要么:
public void GetValue(out int x);
我不太了解它们之间的区别,因此,不知道哪个更好。你能解释一下吗?
谢谢。
当方法没有其他要返回的值时,返回值几乎 总是 正确的选择。(事实上,我不能想到这里我想任何情况下, 曾经 想要一个空白方法与out参数,如果我当初的选择。C#7的Deconstruct方法语言支持的解构作为一个非常,非常罕见的例外)
out
Deconstruct
除了其他方面,它使调用者不必单独声明变量:
int foo; GetValue(out foo);
与
int foo = GetValue();
输出值还可以防止方法链接,如下所示:
Console.WriteLine(GetValue().ToString("g"));
(实际上,这也是属性设置器的问题之一,这就是为什么构建器模式使用返回构建器的方法的原因,例如myStringBuilder.Append(xxx).Append(yyy)。)
myStringBuilder.Append(xxx).Append(yyy)
另外,out参数在反射时更难使用,通常也使测试更加困难。(通常要花更多的精力来简化返回值的模拟,而不是out参数)。基本上没有什么可以让他们 更容易 …
返回值FTW。
编辑:就发生了什么…
基本上,当您为“ out”参数传递参数时, 必须 传递一个变量。(数组元素也被分类为变量。)您调用的方法在其堆栈上没有用于参数的“新”变量- 它使用您的变量进行存储。变量中的任何更改都将立即可见。这是一个显示差异的示例:
using System; class Test { static int value; static void ShowValue(string description) { Console.WriteLine(description + value); } static void Main() { Console.WriteLine("Return value test..."); value = 5; value = ReturnValue(); ShowValue("Value after ReturnValue(): "); value = 5; Console.WriteLine("Out parameter test..."); OutParameter(out value); ShowValue("Value after OutParameter(): "); } static int ReturnValue() { ShowValue("ReturnValue (pre): "); int tmp = 10; ShowValue("ReturnValue (post): "); return tmp; } static void OutParameter(out int tmp) { ShowValue("OutParameter (pre): "); tmp = 10; ShowValue("OutParameter (post): "); } }
结果:
Return value test... ReturnValue (pre): 5 ReturnValue (post): 5 Value after ReturnValue(): 10 Out parameter test... OutParameter (pre): 5 OutParameter (post): 10 Value after OutParameter(): 10
区别在于“发布”步骤- 即更改了局部变量或参数之后。在ReturnValue测试中,这与静态value变量没有区别。在OutParameter测试中,value变量由以下行更改tmp = 10;
value
tmp = 10;