//我的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!
下篇與大家一起學習 傳值參數--引用類型,不創建新對象,只操作對象
-----------------------------------------------------------------------------------------------------------------------
希望廣大網友指出問題所在,指出我哪裡理解錯了,共同交流,共同進步!