這篇文章主要介紹“C#中b=a的多種情況及結(jié)果分析”,在日常操作中,相信很多人在C#中b=a的多種情況及結(jié)果分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#中b=a的多種情況及結(jié)果分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機房租用、四川主機托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),咨詢電話:18982081108
兩個相同類型的變量a和b,并且有如下關(guān)系:
b=a;
如果a發(fā)生改變,b是否也發(fā)生改變呢?
情況很復(fù)雜,分以下幾種情況談?wù)摚?/p>
1) 單個實體
1. 簡單類型
先考察int:
inta=1; intb=a; a=2; Console.WriteLine("b:"+b);
輸出結(jié)果:
再考察一下string:
stringa="1"; stringb=a; a="2"; Console.WriteLine("b:"+b);
輸出結(jié)果:
如果不放心,還可以測試一下Enum,結(jié)果類似,詳見Demo。
結(jié)論:簡單類型是組成復(fù)合類型的最基本單位,是原子,不可再拆分,所以不管是值類型double、int還是引用類型string,b都不隨a的改變而改變,因為它們指向全局堆棧(對于string而言是托管堆)上的同一個地址。
2. 復(fù)合類型
復(fù)合類型是由string、int、double這些簡單類型組成的。
分別定義一個復(fù)合的引用類型(class)和一個復(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é)果:
結(jié)論:b和a仍然指向托管堆上的同一個UserInfo實例的地址。而UserInfo實例的成員又包含著UserName和Age分別在托管堆和全局堆棧上的地址。所以修改a的成員UserName和Age,只是改變這兩個成員的地址,而沒有改變UserInfo實例的地址,所以b的成員UserName和Age也會跟著改變。
讓我們局部修改上面的代碼:
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é)果:
結(jié)論:對a重新進(jìn)行實例化,導(dǎo)致a指向一個新的UserInfo實例的地址。而b仍然指向原先那個UserInfo實例的地址,所以b不會隨著a的改變而改變。從此b和a是兩個沒有任何關(guān)系的變量。
再來看一下值類型:
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é)果:
結(jié)論:問題集中在b=a這句話上。這時b指向的是a的一份copy,指向全局堆棧上的與a不同的地址。所以b和a是沒有任何關(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é)果:
結(jié)論:b隨著a中數(shù)據(jù)增減修改而變化。因為b和a指向托管堆上同一個List
數(shù)組就不說了,可以看作是多個變量的集合,所以按照集合來處理。
到此,關(guān)于“C#中b=a的多種情況及結(jié)果分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當(dāng)前名稱:C#中b=a的多種情況及結(jié)果分析
網(wǎng)址分享:http://chinadenli.net/article0/iheioo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計、手機網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)