今天做了道题,大概可以简化如下
public class C
{
public int i = -1;
public C(int i)
{
this.i = i;
}
public static void set(C c)
{
c.i = 0;
c = new C(13);
}
}
class Program
{
static void Main(string[] args)
{
C c = new C(12);
C.set(c);
Console.WriteLine(c.i.ToString());
Console.Read();
}
}
输出是多少?
我选择的12,但是结果是0。原因解释:
这里传入的是引用,在复制的过程中,复制了指向调用者的对象的引用。 这里传入的其实是一个引用,在复制的过程中,复制了指向调用者的对象的引用,在调用set()方法与调用者指向同一个对象,所以可以改变状态数据,但是在调用的方法体内,重新实例化,却是不行的。Andrew Troelsen的书中写道:If a reference type is passed by value, the callee may change the values of the object’s state data but not the object it is referencing. 如果按值传递引用类型,被调用者可能改变对象的状态数据的值,但不能够改变所引用的对象。