首页 > 代码库 > C#——传值参数(2)

C#——传值参数(2)

//我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)《C#语言入门详解》学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师!

 

这次与大家共同学习C#中的 值参数——引用类型

上篇文章我与大家共同学习了 值参数——值类型

我们知道:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的值

这次来看 值参数——引用类型,创建新对象

看一个例子:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ParametersSimple
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Student stu = new Student() { Name = "Tom" };
14             Method(stu);
15             Console.WriteLine(stu.Name);
16         }
17 
18         //创建一个叫Method的静态方法传进来的参数是Student类型的参数
19         //方法内我们创建一个实例并由stu这个参数引用着,新创建的实例名字叫“Mark”
20         static void Method(Student stu)
21         {
22             stu = new Student() { Name = "Mark" };
23             Console.WriteLine(stu.Name);
24         }
25     }
26 
27     class Student
28     {
29         public string  Name { get; set; }
30     }
31 }

程序运行后,窗口内上下两行分别显示:

----------------------------------------------

Mark

Tom

-----------------------------------------------

大家可以自行编译一下。

解释:

引用类型存储的是实例的地址

方法外的变量stu存储了对象的地址,传入方法里的值也便是对象的地址,还记着吗:值参数创建变量的副本 此时方法内的副本也存储了这个对象的地址

我们调用方法后,改变了副本里的值,也便就是改变了副本里之前存的地址,换成了一个新地址,那么自然而然的它指向了一个新对象 还记着吗:对值参数的改变不会影响变量的值

所以 方法外的变量依旧指向原来的那个对象,而更改后的副本指向了一个新对象,它们互不影响。

 

这个例子有个坏处,那就是我把方法内和方法外的stu的对象的名字都改成一样的,程序运行完后屏幕上打印出两个相同的名字,那么就无法分辨了。

所以我们要改进!

GetHashCode() 方法
每个对象的HashCode是不一样的
所以:
 1 namespace ParametersSimple
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Student stu = new Student() { Name = "Tom" };
 8             Method(stu);
 9             Console.WriteLine("{0},{1}", stu.GetHashCode(), stu.Name);
10         }
11 
12         13         
14         static void Method(Student stu)
15         {
16             stu = new Student() { Name = "Tom" };//我把这里的名字改的和方法外的一样了
17             Console.WriteLine("{0},{1}",stu.GetHashCode(),stu.Name);
18         }
19     }
20 
21     class Student
22     {
23         public string  Name { get; set; }
24     }
25 }

运行结果

技术分享

注意到了吗,名字前面的数值不一样,说明他们分别指向了不同的对象,方法内的副本指向了一个新的对象

------------------------------------------------------------------------------------------------------------------------

To be Continued!

下篇与大家一起学习  传值参数--引用类型,不创建新对象,只操作对象

 -----------------------------------------------------------------------------------------------------------------------

希望广大网友指出问题所在,指出我哪里理解错了,共同交流,共同进步!

C#——传值参数(2)