中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#?List的賦值問題如何解決

發布時間:2022-07-22 11:54:40 來源:億速云 閱讀:223 作者:iii 欄目:開發技術

這篇文章主要介紹“C# List的賦值問題如何解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C# List的賦值問題如何解決”文章能幫助大家解決問題。

問題描述

如下圖所示,query1是個集合,把它賦值給了query2,當移除query2里面數據的時候,query1對應的數據也被移除了。

C#?List的賦值問題如何解決

原因分析:

對此猜測是引用類型的問題,類似于淺拷貝深拷貝那種概念。

基礎概念:

對于上述的情況,要怎么去賦值,以及不同的寫法對應的結果是什么樣的呢,我做了如下測試 ,在看結果之前,先了解一下相關概念。

C#中的堆和棧:(指的是程序運行時的內存區域)

內存分為堆區域和棧區域,棧空間比較小,但是讀取速度快(先進后出),堆空間比較大,但是讀取速度慢。

棧區:存放函數的參數,局部變量,返回數據等值,會自動釋放。

堆區:存放著引用類型的對象,會由GC來自動釋放。

值類型和引用類型

值類型:在方法傳遞的時候,傳遞的是自身的“拷貝”。
(例如:結構體struct,數據類型short/int/double/bool,枚舉類型enum,可空類型)

引用類型:引用類型則是傳遞的自身的“地址”。
( 例如:數組,類,接口,委托,object,string)

值類型只需要一段單獨的內存(此處指棧區內存),用于存儲實際的數據。

引用類型需要兩段內存,第一段存儲實際的數據,位于堆中。第二段是一個引用,存儲在棧里,指向數據在堆中的存放位置。

特點:
1、值類型變量聲明后,不管是否已經賦值,編譯器為其分配內存。
2、引用類型當聲明一個類時,只在棧中分配一小片內存用于容納一個地址,而此時并沒有為其分配堆上的內存空間。當使用 new
創建一個類的實例時,分配堆上的空間,并把堆上空間的地址保存到棧上分配的小片空間中。
3、值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。(某些情況指的是:作為字段時,跟隨其所屬的變量(實例)存儲;作為局部變量時,存儲在棧上。)
4、引用類型的對象總是在進程堆中分配(動態分配)。

本地測試:

下圖展示了4個list以及對應的賦值情況,從結果可以看出,list1、list3、list4的棧區內容都指向了同一個堆地址,所以當這三個list任意一個刪除數據或添加數據,其他兩個也會變化。而list2由于指向的堆地址跟其他三個不同,所以list2的數據變化不會影響到list1、list3、list4。

C#?List的賦值問題如何解決

其中list4比較出乎我的意料,印象中list t=new list中的關鍵字new,會在托管堆上重新分配空間,并返回一個該空間的地址,但是從結果上來看,list4還是指向了list1的堆地址。猜測可能是編譯器的自動優化?就像string的賦值那樣?

下面是string的測試,圖一是定義了三個變量,a、b、c,可以看出,a和b雖然是分別定義并且分別賦值的,但由于值一樣,最終還是指向了同一個堆地址。而圖二中,給a重新賦值后,發現它并沒有去更改原地址中的數據,而是在堆中開辟了一塊新的空間,并指向了這個新的堆地址(在棧中的地址沒變)。

C#?List的賦值問題如何解決

C#?List的賦值問題如何解決

關于“C# List的賦值問題如何解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巨野县| 广州市| 定西市| 淮滨县| 临邑县| 化德县| 青河县| 雷山县| 滨州市| 华池县| 珲春市| 北辰区| 东平县| 呈贡县| 新乐市| 大悟县| 金阳县| 苗栗市| 闽清县| 海南省| 茂名市| 高阳县| 固安县| 厦门市| 齐齐哈尔市| 耒阳市| 韶山市| 福鼎市| 砀山县| 宁武县| 德令哈市| 同仁县| 阿坝县| 娄底市| 五常市| 太和县| 叶城县| 枣庄市| 论坛| 新竹县| 溧阳市|