按引用传递与按值传递结果
Pass by Reference vs Pass by value result
通过引用调用为形式参数创建别名,因此典型参数的每次更改也会影响形式参数,而传递值-结果将结果复制到典型参数,并且当函数 returns ,它将典型参数复制到正式参数。(注意按值调用结果与按值调用完全不同)。
除了这两种传参方式在实现上的区别外,我觉得最后的结果应该是一样的。
我的问题是这两种方法是否总是给出相同的结果,或者您能否举例说明这两种方法 return 不同的结果?
如果在方法执行过程中读取原始变量,情况会有所不同。这可能是因为:
- 两个参数均使用相同的基础变量提供
- 该方法调用了更多从原始变量读取的代码
- 涉及其他线程
这是一个 C# 示例:
using System;
class Test
{
static void Main()
{
int p = 10;
Foo(ref p, () => Console.WriteLine(p));
}
static void Foo(ref int x, Action action)
{
action();
x = 20;
action();
}
}
这个输出是
10
20
... 因为在第二次调用action()
的时候,p
的值已经变成了20,如果使用pass-by-result的话,[=13的值=] 只会在 Foo
返回时改变。
通过引用调用为形式参数创建别名,因此典型参数的每次更改也会影响形式参数,而传递值-结果将结果复制到典型参数,并且当函数 returns ,它将典型参数复制到正式参数。(注意按值调用结果与按值调用完全不同)。
除了这两种传参方式在实现上的区别外,我觉得最后的结果应该是一样的。
我的问题是这两种方法是否总是给出相同的结果,或者您能否举例说明这两种方法 return 不同的结果?
如果在方法执行过程中读取原始变量,情况会有所不同。这可能是因为:
- 两个参数均使用相同的基础变量提供
- 该方法调用了更多从原始变量读取的代码
- 涉及其他线程
这是一个 C# 示例:
using System;
class Test
{
static void Main()
{
int p = 10;
Foo(ref p, () => Console.WriteLine(p));
}
static void Foo(ref int x, Action action)
{
action();
x = 20;
action();
}
}
这个输出是
10
20
... 因为在第二次调用action()
的时候,p
的值已经变成了20,如果使用pass-by-result的话,[=13的值=] 只会在 Foo
返回时改变。