首页 > Python基础教程 >
-
C#教程之C#——传值参数(2)
这次与大家共同学习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!
下篇与大家一起学习 传值参数--引用类型,不创建新对象,只操作对象