結構與類的物件在引用上的不同之處

liuxixi發表於2016-08-17

最近程式編寫用到了存入model實體物件值到list中,如下所示:

1 foreach (var i in tasks)
2 {
3 task1 taskinfo=new task1();
4 taskinfo.ID = i.ID.ToString(); 5 taskinfo.TASK_TITLE = i.TASK_TITLE; 6 taskinfo.T_AREAINFO_ID = i.T_AREAINFO_ID.ToString(); 7 taskList.Add(taskinfo); 8 }

上述taskList為task物件的list陣列,taskinfo為task物件例項,task為結構體model。若task為類,那麼taskList到最後都會是一樣的值,即最後一次taskinfo的值。若為結構體,則taskList每次存入的值都不同。 

用到List<T>,T為結構時,new 物件,物件每次生成值存入list中,list存入每次生成的值;T為類時,new 物件,物件每次生成值存入list中,list存入的都會變成最近一次生成的值。

也就是說:結構與類,new一個物件時,結構每次引用物件都會生成不同的值,但類的物件每次生成的值都會把前面的值覆蓋。

原因:結構物件每次生成的值都會開闢新的記憶體空間,來存放每次的值,而類物件每次生成的值
都會只在原來new生成的物件記憶體空間中,記憶體固定,所以會把原來的值覆蓋掉。
即如下面所說:
類:

類是引用型別在堆上分配,類的例項進行賦值只是複製了引用,都指向同一段實際物件分配的記憶體

類有構造和解構函式

類可以繼承和被繼承

結構:

結構是值型別在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結構的賦值將分配產生一個新的物件。

結構沒有建構函式,但可以新增。結構沒有解構函式

結構不可以繼承自另一個結構或被繼承,但和類一樣可以繼承自介面

相關文章