一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的。但是今天一调试踪了一下变量内存情况才发现大有不同。
直接上代码,结论是:以下代码是使用了 ref 关键字的版本,它输出10;如果不使用ref 关键字则输出 1,2,3
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int[] myArray = new int[] { 1, 2, 3 }; 6 new SetClass().SetArray(ref myArray); 7 /* 8 不加ref关键字的引用类型传参情况 加上ref关键字后的引用类型传参情况 9 &myArray &myArray 10 0x000000c088d7e3d0 0x0000008151b7e6b0 11 *&myArray: 0x0000029b3f84ae00 *&myArray: 0x000001c5e5a7ae00 12 */ 13 14 foreach (int i in myArray) 15 Console.WriteLine(i); 16 /* 17 &myArray &myArray 18 0x000000c088d7e3d0 0x0000008151b7e6b0 19 *&myArray: 0x0000029b3f84ae00 *&myArray: 0x000001c5e5a7ae00 20 */ 21 } 22 23 } 24 25 class SetClass 26 { 27 //如果形参 array 是引用类型时(不论加不加 ref 关键字),则在方法执行时方法体内的局部变量 array 指向外部传进来的实参所指向的内存空间。 28 //但是加上 ref 关键后在方法执行时方法体内接收传进来的实参时,并不会给 array 变量分配内存空间,即 变量array就是变量myArray。 29 internal void SetArray(ref int[] array) 30 { 31 /* 32 &array &myArray 33 0x000000c088d7e388 0x0000008151b7e6b0 34 *&array: 0x0000029b3f84ae00 *&myArray: 0x000001c5e5a7ae00 35 */ 36 array = new int[] { 10 }; 37 /* 38 &array &myArray 39 0x000000c088d7e388 0x0000008151b7e6b0 40 *&array: 0x0000029b3f84bbf0 *&myArray: 0x000001c5e5a7ae00 41 */ 42 } 43 } 44 }