c#中值型別和引用型別的區別

echo_sw發表於2024-10-16

前言:
  最近單位活不多,威某人就把摸魚的時間奉獻出來吧,接下來開始我們驚心動魄且異常艱難的c#基礎篇,坐穩了嗎同學們,讓我們進入第一章節“值型別於引用型別的區別”

1.值型別和引用型別有哪些:

  •   值型別包括基本資料型別(如:int,float,bool),結構體(如:struct),列舉(enumrations).
  •   引用型別包括類(classes),介面(interfaces),委託(delegates),陣列(arrays)等

2.重點:

  •   值型別和引用型別的區別主要體現於記憶體中的儲存方式,賦值傳遞行為,預設值以及生命週期

2.1.儲存方式:

  • 值型別儲存在棧上,引用型別儲存在堆上

2.2.賦值傳遞行為:

  •   值型別賦值給另一個變數時,會建立一個屬於他們兩的一個副本,而引用型別賦值給另一個變數時則會複製引用地址指向同一個物件

2.3.預設值:

  • 值型別通常都會有屬於自己的預設值例如int預設值是0,bool預設值是false,引用型別的預設值是null,說明引用型別在初始化階段時沒有指向任何的物件

2.4.生命週期:

  •   值型別的生命週期主要取決於它所在的程式碼塊或者說時方法中,其實這裡也可以說取決於它所在的作用域中,例如一個值型別的變數在一個方法中,當這個方法被呼叫完後其佔用的記憶體會被迅速回收
  •   引用型別的生命週期由垃圾回收器(GC)管理,當沒有引用指向他們時,GC會將它回收

  總結就是:值型別的生命週期相對簡單和短暫,與它們所在的作用域直接相關;而引用型別的生命週期取決於是否有引用指向它們,並且由垃圾回收器來管理其記憶體的回收。
3.擴充套件:

3.1.可變性和不可變性:

  •   值型別是不可變的,因為每次操作都會建立一個副本
  •   引用型別是可變的,因為修改的是物件本身,所有指向該物件引用的都可以看到相應的修改

3.2.效能和開銷:

  •   由於值型別存在於棧中,所以它們的分配和讀取的開銷相對來說比較小比較快,而引用型別儲存於堆上並且涉及垃圾回收機制,因此可能會有更高的開銷
  •   另一方面如果值型別很大,複製開銷可能會比引用型別更高

3.3.裝箱和拆箱:

  •   值型別可以隱式轉換為引用型別,我們稱這個為裝箱,例如,int轉換為object
  •   拆箱則是將裝箱的值型別轉換回來,需要注意的是頻繁的裝箱和拆箱會導致效能損耗,因此要合理使用

結尾:
  值型別和引用型別是我們在學習和實踐c#中絕不可避免的部分,希望本章內容對你會有所幫助,當然如果有不懂或者不同見解的小夥伴也可以在評論區打出你的想法,互相討論互相學習~

相關文章