如果设置属性,为什么这些值会像引用传递的对象那样改变?

Mik*_*ike 2 c#

程序:

  class Program
  {
    class class1
    {
      public string Name { get; set; }
      public int Value { get; set; }
    }

    class class2
    {
      public string Name { get; set; }
      public int Value { get; set; }
    }

    static void Main(string[] args)
    {
      var Source = new class1() { Name = "Source", Value = 1 };
      var Target = new class2() { Name = "Target", Value = 2 };

      setValue(Source, Target);
      Console.WriteLine(string.Format("Source - Name:{0} Value:{1}", Source.Name,Source.Value));
      Console.WriteLine(string.Format("Target - Name:{0} Value:{1}",Target.Name, Target.Value));
    }

    private static void setValue(object Source, object Target)
    {

      Target  = Source;
    }    
  }  
Run Code Online (Sandbox Code Playgroud)

当这运行我得到(我期望):

Source - Name:Source Value:1
Target - Name:Target Value:2
Run Code Online (Sandbox Code Playgroud)

但是当我将setValue方法更改为:

private static void setValue(object Source, object Target)
{
  var source = Source as class1;
  var target = Target as class2;

  target.Name = source.Name;
  target.Value = source.Value;
}  
Run Code Online (Sandbox Code Playgroud)

我明白了:

Source - Name:Source Value:1
Target - Name:Source Value:1
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

这一行:

Target  = Source;
Run Code Online (Sandbox Code Playgroud)

只是将值复制Source到变量中Target.

该值只是一个参考 - Target实际上只是一个局部变量,因为它是一个正常的参数.

在您的其他代码中:

var source = Source as class1;
var target = Target as class2;

target.Name = source.Name;
target.Value = source.Value;
Run Code Online (Sandbox Code Playgroud)

这是在设置数据其由参数所指的对象.想想这样.想象一下,你给某人一张带有地址的纸,然后他们去那个地址并将房子涂成红色.之后你自己去看房子,你会发现它是红色的.

现在将它与你的第一个例子进行比较 - 这就像给某人一张纸,然后他们划掉地址并将红房子的地址写在上面.你没有看到这一点 - 你只是给了他们一张纸,让他们继续下去.因此,当你去原始地址时,你看不到红房子,因为它没有改变.

我有两篇文章可以帮助您理解所涉及的概念: