我遇到了这个棘手的问题。请参阅以下代码:
public class Foo
public int A { get; set; }
}
static void Main(string[] args)
{
Foo foo1 = new Foo();
Foo foo2 = new Foo();
ChangeObject1(foo1);
ChangeObject2(ref foo2);
Console.WriteLine("Foo1 = " + foo1.A);
Console.WriteLine("Foo2 = " + foo2.A);
Console.ReadKey();
}
static void ChangeObject1(Foo foo)
{
foo.A += 1;
foo = new Foo();
}
static void ChangeObject2(ref Foo foo)
{
foo.A += 1;
foo = new Foo();
}
经过一番测试,foo1.A 等于 1,而 foo2.A 仍然等于 0。据我了解,这是因为第二种方法是通过引用而不是值传递的实例。这会更改实例的内容,因此当在方法中创建和分配新对象时,不再定义值。
但是想一想我就迷惑了,因为我觉得第一种方法应该有类似的效果,即使它是按值传递的,因为实例的内容仍然在方法之外发生了变化。
有谁知道实际发生了什么?谢谢!