成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
在這里我們將談到C#中b=a的多種情況,希望本文能驗證一個容易混淆的概念,對大家有所幫助。

在這里我們將介紹#中b=a的多種情況及結果,希望通過本文仔細做好兩個變量中,一個改變而另一個的狀態,希望對大家有所幫助。

本文旨在驗證一個容易混淆的概念,從而為《玩轉WPF/Silverlight中INotifyPropertyChanged和ObservableCollection》做鋪墊。

兩個相同類型的變量a和b,并且有如下關系:

b=a;

如果a發生改變,b是否也發生改變呢?

情況很復雜,分以下幾種情況談論:

1) 單個實體

1. 簡單類型

先考察int:

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

clip_image002

再考察一下string:

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

輸出結果

如果不放心,還可以測試一下Enum,結果類似,詳見Demo。

結論:簡單類型是組成復合類型的最基本單位,是原子,不可再拆分,所以不管是值類型double、int還是引用類型string,b都不隨a的改變而改變,因為它們指向全局堆棧(對于string而言是托管堆)上的同一個地址。

2. 復合類型

復合類型是由string、int、double這些簡單類型組成的。

分別定義一個復合的引用類型(class)和一個復合的值類型(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);
輸出結果:

輸出結果

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

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

  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);
輸出結果:

輸出結果

結論:對a重新進行實例化,導致a指向一個新的UserInfo實例的地址。而b仍然指向原先那個UserInfo實例的地址,所以b不會隨著a的改變而改變。從此b和a是兩個沒有任何關系的變量。

再來看一下值類型:

  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);
輸出結果:

另一種輸出結果

結論:問題集中在b=a這句話上。這時b指向的是a的一份copy,指向全局堆棧上的與a不同的地址。所以b和a是沒有任何關系的,b不隨a的改變而改變。


2) 集合

1.集合中一筆數據的增刪修改。

  1. List<UserInfo>a=newList<UserInfo>();
  2. List<UserInfo>b=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);
輸出結果:

輸出結果

結論:b隨著a中數據增減修改而變化。因為b和a指向托管堆上同一個List實例的內存地址,這和復合類型是一樣的。

數組就不說了,可以看作是多個變量的集合,所以按照集合來處理。寫了幾段測試代碼,放在Demo中。

原文標題:對于C#中b=a的N種情況分析

鏈接:http://www.cnblogs.com/Jax/archive/2009/10/12/1581725.html

【編輯推薦】

  1. C#數組基礎介紹與操作詳解
  2. 淺析C#數組初始化性能測試
  3. C#數組操作詳細剖析
  4. 淺析C#數組操作方法
  5. C#數組和串操作經驗總結
責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-27 15:00:55

C#線程控制

2009-09-01 10:20:28

C#多種語句

2010-02-23 18:10:01

WCF綁定類型

2009-08-24 15:02:05

C# 類型

2009-08-27 16:00:59

C#中using用法

2009-08-21 17:53:28

C#查詢結果

2009-08-18 10:30:30

C#枚舉

2025-02-10 10:52:34

WinForm窗口閃爍C#

2009-08-27 13:27:50

C# this保留字

2009-08-26 10:34:59

C# Hashtabl

2009-09-01 09:16:57

C#使用SharpZi

2024-06-24 08:33:06

2009-08-19 11:21:02

C# ListBox控

2009-08-26 16:46:06

C# ThreadSt

2022-07-10 20:47:39

linux中虛擬內存

2024-11-06 11:38:59

C#單例模式

2009-08-26 14:16:17

C# FrameWor

2024-04-15 16:11:33

C#HTTP請求.NET

2009-01-19 10:26:02

C#Namespace.NET

2009-08-03 16:39:56

C# Assembly
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区高清视频 | 国产精品毛片无码 | 人人擦人人 | 免费成人高清在线视频 | 亚洲h色| 国产美女精品视频免费观看 | 精品国产一区二区国模嫣然 | 免费午夜电影 | 亚洲精品电影网在线观看 | 国产成人一区二区三区 | 二区欧美 | 免费看片在线播放 | 天堂色网 | 日韩精品999 | 在线视频一区二区三区 | 国产福利91精品一区二区三区 | 91免费版在线观看 | 国产欧美日韩 | 日本人和亚洲人zjzjhd | 91久久久久 | 久久久www成人免费无遮挡大片 | 免费观看的黄色网址 | 精品久久影院 | 久久精品小视频 | 成人av网站在线观看 | 中文字幕一区在线 | 亚洲av毛片| 一区二区三区四区在线免费观看 | 蜜臀91视频 | www.黄色网 | 国产激情在线 | 香蕉婷婷| 免费一级欧美在线观看视频 | 欧美一区二区三区在线看 | 天天干夜夜拍 | 久久精品在线播放 | 久久久男人的天堂 | 亚洲网在线| 亚洲国产精久久久久久久 | 久久一区二区三区电影 | 中文字幕一区二区三区不卡 |