上篇文章我与大家共同学习了 值参数——引用类型
这次与大家共同学习 传值参数--引用类型,不创建新对象,只操作对象
这是个思维导图:
我们仍需记住:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的值
看一个例子:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Student stu = new Student() { Name = "Elliot" }; 6 Console.WriteLine("Name is {0}, HashCode is {1}", stu.Name, stu.GetHashCode()); 7 UpdateObject(stu); 8 //调用方法后我们再打印一遍 9 Console.WriteLine("Name is {0}, HashCode is {1}", stu.Name, stu.GetHashCode()); 10 11 } 12 13 //没有创建新对象 14 static void UpdateObject(Student stu) 15 { 16 stu.Name = "Mark"; 17 Console.WriteLine("Name is {0}, HashCode is {1}",stu.Name,stu.GetHashCode()); 18 } 19 } 20 21 class Student 22 { 23 public string Name { get; set; } 24 } 25 }
运行结果:
看:
第一行是我们在Main方法里创建一个对象后立即打印出他的名字和hashcode;
第二行则是UpdateObject方法里打印的;
第三行则是在调用完方法后又打印了一遍
发现后两行是完全一样的
解释:
引用类型的变量存储的是对象在堆内存中的地址,传进来的参数是变量的一个副本,所以它们都存储的是对象的地址,我们通过参数访问了对象,修改了对象里的值,由于变量和参数都指向的是同一个对象,所以它们的名字就变得一样,而hashcode一直一样。
对象还是那个对象,但对象里的值改变了
这就是我们用值参数只更新对象而不创建新对象
注意:
在现实工作中,像这样通过传进来的参数改变对象里的值的情况是少见的,因为方法主要输出还是靠返回值,我们把这种通过传进来的参数改变对象里的值的操作叫做某个方法的副作用(side-effect),工作中要尽量避免这种副作用。
------------------------------------------------------------------------------------------------
To be continued!
下篇与大家共同学习 canshu.html" target="_blank">引用参数
------------------------------------------------------------------------------------------------
希望大家积极评论,指出我的问题所在,共同交流,共同进步!