将 return 值分配给变量时是否总是生成副本?

Is always a copy made when a return value is assigned to a variable?

C# language reference 声称

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通过 refout,仅通过 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