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