日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
分析C#中b=a的多種情況及結(jié)果

在這里我們將介紹#中b=a的多種情況及結(jié)果,希望通過(guò)本文仔細(xì)做好兩個(gè)變量中,一個(gè)改變而另一個(gè)的狀態(tài),希望對(duì)大家有所幫助。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到密山網(wǎng)站設(shè)計(jì)與密山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋密山地區(qū)。

本文旨在驗(yàn)證一個(gè)容易混淆的概念,從而為《玩轉(zhuǎn)WPF/Silverlight中INotifyPropertyChanged和ObservableCollection》做鋪墊。

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

b=a;

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

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

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

1. 簡(jiǎn)單類型

先考察int:

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

輸出結(jié)果:

再考察一下string:

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

輸出結(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)。

 
 
 
 
  1. classUserInfo
  2. {
  3. publicstringUserName;
  4. publicintAge;
  5. }
  6. structUserInfo2
  7. {
  8. publicstringUserName;
  9. publicintAge;
  10. }

先討論引用類型:

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


輸出結(jié)果:

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

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

 
 
 
 
  1. UserInfoa=newUserInfo(){UserName="Baobao",Age=27};
  2. UserInfob=a;
  3. //a.UserName="AndersLiu";
  4. //a.Age=30;
  5. a=newUserInfo(){UserName="AndersLiu",Age=30};
  6. Console.WriteLine("b.UserName:"+b.UserName);
  7. Console.WriteLine("b.Age:"+b.Age);

輸出結(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)看一下值類型:

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

輸出結(jié)果:

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

2) 集合

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

 
 
 
 
  1. Lista=newList();
  2. Listb=a;
  3. a.Add(newUserInfo(){UserName="Baobao",Age=27});
  4. Console.WriteLine("b.Countafteradding:"+b.Count);
  5. Console.WriteLine();
  6. Console.WriteLine("Aftermodifyinga[0]");
  7. a[0].UserName="AndersLiu";
  8. a[0].Age=30;
  9. Console.WriteLine("b[0].UserName:"+b[0].UserName);
  10. Console.WriteLine("b[0].Age:"+b[0].Age);
  11. Console.WriteLine();
  12. a.Remove(a[0]);
  13. Console.WriteLine("b.Countafterdeleting:"+b.Count);


輸出結(jié)果:

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

數(shù)組就不說(shuō)了,可以看作是多個(gè)變量的集合,所以按照集合來(lái)處理。寫(xiě)了幾段測(cè)試代碼,放在Demo中。


當(dāng)前題目:分析C#中b=a的多種情況及結(jié)果
本文地址:http://m.5511xx.com/article/cdpdjdg.html