溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中b=a的多種情況及結(jié)果分析

發(fā)布時(shí)間:2021-09-09 10:06:56 來(lái)源:億速云 閱讀:113 作者:chen 欄目:編程語(yǔ)言

這篇文章主要介紹“C#中b=a的多種情況及結(jié)果分析”,在日常操作中,相信很多人在C#中b=a的多種情況及結(jié)果分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C#中b=a的多種情況及結(jié)果分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

兩個(gè)相同類型的變量a和b,并且有如下關(guān)系:

b=a;

如果a發(fā)生改變,b是否也發(fā)生改變呢?

情況很復(fù)雜,分以下幾種情況談?wù)摚?/p>

1) 單個(gè)實(shí)體

1. 簡(jiǎn)單類型

先考察int:

inta=1; intb=a; a=2; Console.WriteLine("b:"+b);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

再考察一下string:

stringa="1"; stringb=a; a="2"; Console.WriteLine("b:"+b);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

如果不放心,還可以測(cè)試一下Enum,結(jié)果類似,詳見(jiàn)Demo。

結(jié)論:簡(jiǎn)單類型是組成復(fù)合類型的最基本單位,是原子,不可再拆分,所以不管是值類型double、int還是引用類型string,b都不隨a的改變而改變,因?yàn)樗鼈冎赶蛉侄褩#▽?duì)于string而言是托管堆)上的同一個(gè)地址。

2. 復(fù)合類型

復(fù)合類型是由string、int、double這些簡(jiǎn)單類型組成的。

分別定義一個(gè)復(fù)合的引用類型(class)和一個(gè)復(fù)合的值類型(struct)。

classUserInfo { publicstringUserName; publicintAge; } structUserInfo2 { publicstringUserName; publicintAge; }

先討論引用類型:

UserInfoa=newUserInfo(){UserName="Baobao",Age=27}; UserInfob=a; a.UserName="AndersLiu"; a.Age=30; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

結(jié)論:b和a仍然指向托管堆上的同一個(gè)UserInfo實(shí)例的地址。而UserInfo實(shí)例的成員又包含著UserName和Age分別在托管堆和全局堆棧上的地址。所以修改a的成員UserName和Age,只是改變這兩個(gè)成員的地址,而沒(méi)有改變UserInfo實(shí)例的地址,所以b的成員UserName和Age也會(huì)跟著改變。

讓我們局部修改上面的代碼:

UserInfoa=newUserInfo(){UserName="Baobao",Age=27}; UserInfob=a; //a.UserName="AndersLiu"; //a.Age=30; a=newUserInfo(){UserName="AndersLiu",Age=30}; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

結(jié)論:對(duì)a重新進(jìn)行實(shí)例化,導(dǎo)致a指向一個(gè)新的UserInfo實(shí)例的地址。而b仍然指向原先那個(gè)UserInfo實(shí)例的地址,所以b不會(huì)隨著a的改變而改變。從此b和a是兩個(gè)沒(méi)有任何關(guān)系的變量。

再來(lái)看一下值類型:

UserInfo2a=newUserInfo2(){UserName="Baobao",Age=27}; UserInfo2b=a; a.UserName="AndersLiu"; a.Age=30; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

結(jié)論:?jiǎn)栴}集中在b=a這句話上。這時(shí)b指向的是a的一份copy,指向全局堆棧上的與a不同的地址。所以b和a是沒(méi)有任何關(guān)系的,b不隨a的改變而改變。


2) 集合

1.集合中一筆數(shù)據(jù)的增刪修改。

List<UserInfo>a=newList<UserInfo>(); List<UserInfo>b=a; a.Add(newUserInfo(){UserName="Baobao",Age=27}); Console.WriteLine("b.Countafteradding:"+b.Count); Console.WriteLine(); Console.WriteLine("Aftermodifyinga[0]"); a[0].UserName="AndersLiu"; a[0].Age=30; Console.WriteLine("b[0].UserName:"+b[0].UserName); Console.WriteLine("b[0].Age:"+b[0].Age); Console.WriteLine(); a.Remove(a[0]); Console.WriteLine("b.Countafterdeleting:"+b.Count);

輸出結(jié)果:

C#中b=a的多種情況及結(jié)果分析

結(jié)論:b隨著a中數(shù)據(jù)增減修改而變化。因?yàn)閎和a指向托管堆上同一個(gè)List實(shí)例的內(nèi)存地址,這和復(fù)合類型是一樣的。

數(shù)組就不說(shuō)了,可以看作是多個(gè)變量的集合,所以按照集合來(lái)處理。

到此,關(guān)于“C#中b=a的多種情況及結(jié)果分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI