1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。
static void Main(string[]
args) |
Employee
myE = new Employee()
{ id=4}; |
fixed (int*
pId=&(myE.id)) |
Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
fixed (int*
pId = &(myE.id)) |
Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
static void testMethod(Employee
myE) |
fixed (int*
pId = &(myE.id)) |
Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
输出为:
方法执行前,myE中id的地址为0x1AF5BE0,值为4
方法执行中,myE中id的地址为0x1AF5BE0,值为5
方法执行后,myE中id的地址为0x1AF5BE0,值为5
执行过程为:
1) 在堆中新建对象myE,在栈中建立指向myE的指针
2) 按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE
如下图所示:

2、 如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。
static void Main(string[]
args) |
Employee
myE = new Employee()
{ id=4}; |
fixed (int*
pId=&(myE.id)) |
Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
fixed (int*
pId = &(myE.id)) |
Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
static void testMethod(Employee
myE) |
myE
= new Employee()
{ id = 5 }; |
fixed (int*
pId = &(myE.id)) |
Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}",
(uint)&(*pId),
(uint)*pId); |
输出为:
方法执行前,myE中id的地址为0x1E77BE0,值为4
方法执行中,myE中id的地址为0x1E78E24,值为5
方法执行后,myE中id的地址为0x1E77BE0,值为4
执行过程为:
1) 在堆中新建对象myE,在栈中建立指向myE的指针
2) 按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE
3) 方法中new一个新对象时,在堆中新建对象,并把地址传给指针2
