将 return 值分配给变量时是否总是生成副本?
Is always a copy made when a return value is assigned to a variable?
An assignment always performs a simple bit-wise copy of a value into a
variable.
对于 int i = 7;
形式的赋值肯定不是这样,而且我猜在 A a = new A(...);
中只创建了一个实例。 我想知道将方法的 return 值赋值给变量是否始终是 return 值的副本(不是在谈论 ref returns
)。 returned 的局部变量可以安全地重用,否则无论如何它都会被 GC 收集,而不会在方法调用后再次使用。
示例代码:
struct A {
public int f() {
int j = 7;
return j;
}
public int g(out int j) {
return j = 7;
}
}
A a = new A();
int jj = a.f(); // Are j and jj aliases?
int jjj;
a.g(out jjj); // j and jjj are aliases
什么被复制/弹出以及为什么取决于你用它们做什么,你可以很容易地自己弄清楚。
注意 : .Net 规范只有 by value 和 通过 ref 和 out
,仅通过 ref
。因此,正如您所看到的,根据文档
,这一切都是有意义的
struct A
{
public unsafe int f()
{
int j = 7;
Console.WriteLine($"j1 \t: {(uint) &j}");
return j;
}
public unsafe int g(out int j)
{
j = 7;
fixed (int* p = &j)
Console.WriteLine($"j2 \t: {(uint) p}");
return j;
}
}
public static unsafe void Main()
{
A a = new A();
int jj = a.f(); // Are j and jj aliases?
Console.WriteLine($"jj \t: {(uint) &jj}");
int jjj;
var jjjj = a.g(out jjj); // j and jjj are aliases
Console.WriteLine($"jjj \t: {(uint) &jjj}");
Console.WriteLine($"jjjj \t: {(uint) &jjjj}");
}
输出
j1 : 2654464036
jj : 2654464172
j2 : 2654464160
jjj : 2654464160
jjjj : 2654464156
注2:你也可以使用Sharp IO to see whats actually happening a little more clearly, example here
An assignment always performs a simple bit-wise copy of a value into a variable.
对于 我想知道将方法的 return 值赋值给变量是否始终是 return 值的副本(不是在谈论 int i = 7;
形式的赋值肯定不是这样,而且我猜在 A a = new A(...);
中只创建了一个实例。ref returns
)。 returned 的局部变量可以安全地重用,否则无论如何它都会被 GC 收集,而不会在方法调用后再次使用。
示例代码:
struct A {
public int f() {
int j = 7;
return j;
}
public int g(out int j) {
return j = 7;
}
}
A a = new A();
int jj = a.f(); // Are j and jj aliases?
int jjj;
a.g(out jjj); // j and jjj are aliases
什么被复制/弹出以及为什么取决于你用它们做什么,你可以很容易地自己弄清楚。
注意 : .Net 规范只有 by value 和 通过 ref 和 out
,仅通过 ref
。因此,正如您所看到的,根据文档
struct A
{
public unsafe int f()
{
int j = 7;
Console.WriteLine($"j1 \t: {(uint) &j}");
return j;
}
public unsafe int g(out int j)
{
j = 7;
fixed (int* p = &j)
Console.WriteLine($"j2 \t: {(uint) p}");
return j;
}
}
public static unsafe void Main()
{
A a = new A();
int jj = a.f(); // Are j and jj aliases?
Console.WriteLine($"jj \t: {(uint) &jj}");
int jjj;
var jjjj = a.g(out jjj); // j and jjj are aliases
Console.WriteLine($"jjj \t: {(uint) &jjj}");
Console.WriteLine($"jjjj \t: {(uint) &jjjj}");
}
输出
j1 : 2654464036
jj : 2654464172
j2 : 2654464160
jjj : 2654464160
jjjj : 2654464156
注2:你也可以使用Sharp IO to see whats actually happening a little more clearly, example here