C#學習筆記24-值傳遞和引用傳遞

C#學習筆記24-值傳遞和引用傳遞

好久沒更新C#了,但是還是在繼續學習哦,寫博客就是在逐漸複習和不斷推進的過程中,哈哈哈,繼續加油

值傳遞

C#學習筆記10-值類型和引用類型中,我們討論了值類型和引用類型的區別:
1.值類型和引用類型在內存中存儲的地方不一樣,值類型存儲在棧中,引用類型存儲在堆中
2.值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。

那麼值傳遞和引用傳遞的區別在哪呢?

值傳遞是指在調用函數時將實際參數複製一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數,簡單來說,值類型在傳遞時傳遞的是數值本身,我們來看一行代碼

int num1 = 10;
int num2 = 20;
num2 = num1;
num2 = 30;
Console.WriteLine("num1 = {0}, num2 = {1}",num1 ,num2)

對於上述代碼,其輸出爲多少呢?大家肯定會不加思索回答

num1 = 10;
num2 = 30;

對,這就是答案,這就是值傳遞,num2的改變不會影響到num1,用圖來描述就是值類型中的值傳遞只是自個和自個玩,不會去打擾其他小夥伴,就像現在在家自我隔離的我們,每個人都有屬於自己的空間而不去影響他人,哈哈哈
值傳遞

引用傳遞

那麼引用傳遞呢?前面我們說到,引用類型的值是存放在堆中,引用類型的變量存放的是數據地址,所以,引用傳遞時傳遞的就是對這個對象的引用(即地址),因此一個發生改變以後,另一個也會發生改變
我們先從代碼來分析一下引用傳遞,Person是一個類,即引用類型

            Person p1 = new Person();
            p1.Name = "張三";
            Person p2 = new Person();
            Person p = p1;
            p1 = p2;
            p2.Name = "李四";
            p.Name = "abc";
            Console.WriteLine(p1.Name);
            Console.WriteLine(p2.Name);

對於上面的操作,大家又會給出一個什麼答案呢?最後的輸出是什麼呢?
答案揭曉

p1.Name = "abc";
p2.Name = "abc";

這個看起來和前面很不一樣,p1和p2的屬性都發生了改變,但是我們明明沒有對p1和p2的Name屬性進行改動啊,那這是怎麼回事呢?我們來利用圖來分析一下
引用傳遞
我們說過,引用類型是存放在堆中,而其變量存放的只是地址,所以在進行引用傳遞時候,是堆中的屬性在發生變化,但是由於引用傳遞,p1將地址傳給了p和p2.這個時候他們共用一個地址,所以當其中一個發生變化的時候其他的也會跟着改變,這也就是爲什麼當p.Name=“abc"時,p1.Name和p2.Name也會變化

但是,在引用類型中有一個特殊的存在—string類型

string 類型

在前面的博客C#學習筆記11-String的一些方法,我們提到字符串的一種特性,那就是字符串不變性:

當給一個字符串重新賦值時,原值並未銷燬,而是在堆的空間中重新開闢一塊空間進行儲存

因此,這時候當我們對他進行引用傳遞時,傳遞的地址也會發生變化,地址不共用,因此他們不會相互影響,還是以一串代碼來考考自己

            string s1 = "張三";
            string s2 = "李四";
            string s = s1;
            s1 = s2;
            s = "abc";
            Console.WriteLine(s1);
            Console.WriteLine(s2);

答案是什麼?相信看了上面你應該會了,就不揭曉咯

-----------------------以上內容屬於原創,歡迎轉載-------------------------------

在這裏插入圖片描述

在這裏插入圖片描述

~
s1="張三“
s2="李四“

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章