'ref'关键字的内部工作,两个对象指向同一个地址

Sam*_*uel 2 c# ref

查看下面的代码并告诉我为什么在调用函数UpdateContext之后,变量connection2没有与变量connection1相同的哈希码.

当我将变量connection2设置为connection1时,两个变量都有一个指向相同内存地址的指针.但是在函数UpdateContext中通过ref传递变量connection1后,使用'new'指令修改指针,connection1有一个新的指针地址,但connection2仍然是旧地址.

   class Program
   {
      static void Main(string[] args)
      {
         var connectionInitializer = new ConnectionInitializer();

         connectionInitializer.Initialize();

         Console.ReadLine();
      }
   }

   public class Connection
   {

   }

   public class ConnectionInitializer
   {
      public void Initialize()
      {
         var connection1 = new Connection();
         var connection2 = connection1;

         Console.WriteLine("Connection 1 (Before ref): " + connection1.GetHashCode());
         Console.WriteLine("Connection 2 (Before ref): " + connection2.GetHashCode());

         this.UpdateContext(ref connection1);

         Console.WriteLine("Connection 1 (After ref): " + connection1.GetHashCode());
         Console.WriteLine("Connection 2 (After ref): " + connection2.GetHashCode());
      }

      private void UpdateContext(ref Connection connection)
      {
         connection = new Connection();
      }
   }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

Kir*_*oll 8

你似乎误解了ref想要实现的目标.基本上,当您将变量作为ref参数传递时,它允许被调用者修改(原始)变量的值,就像它是本地的一样.鉴于此,为什么您希望覆盖变量connection1的值以更改分配给的值connection2

换句话说,使用ref类似于这段代码:

var connection1 = new Connection();
var connection2 = connection1;
connection1 = new Connection()
Run Code Online (Sandbox Code Playgroud)

显然在这种情况下,connection2应该保持不变.对你来说也是如此.