iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Software Development

如果可以,我想用30天的時間打造一間抵霸閣系列 第 11

[Day11]抵霸閣-關於記憶體與型別之間微妙的關係

  • 分享至 

  • xImage
  •  

由於在公司開會時主管提到面試時經常會問的問題
實值型別(Value Type)/參考型別(Reference Type) 的區別 [C#]
老實說在學校上課時只覺得知道一些像是string,int,char,double就差不多可以寫一些計算的題目了
對於程式與記憶體的關係可以說是零基礎
然而就經常會遇到在function內的參數與回傳值之間的變化與想像的結果不同之類的問題
先來介紹實值型別,常見的int,char,double,bool皆屬之
其特性為物件的記憶體(Stack)位址存放的值 就是物件的值
參考型別的記憶體(Heap)位址存放的值 則是真實值的位址
常見的型別像是string,array,class皆屬之
其需要使用 new 這個關鍵字來實體化類別的物件
參考型別(Pass by reference)傳遞資料會比實值型別(Pass by value)來得有效率
因為參考型別就像是共享連結的概念
不用像實值型別需要把影片載下來再分享
但當連結有天突然被設為私人的話
對使用參考型別的朋友來說 就無法看到影片了
但用實值型別的親故則不受影響
照樣點開自己載的影片來看

若有點難記哪些型別屬於實值型別or參考型別時 有一種方式可以迅速地區分
當在宣告變數沒有給預設值的話,印出該變數的值來看時若為null,其為參考型別;反之便是實值型別

其中需要特別注意的是最常被誤會的string
它雖然隸屬於參考型別
但它的特性又比較像是實值型別
像是當宣告了string型別的變數
從記憶體的角度來看它的值就是固定的
即使將此變數修改也不會動到原本的記憶體
若不信的話也可以用object.ReferenceEquals的方法來比較兩變數的記憶體位置是否相同
即可解惑

補充說明:除了實值型別和參考型別外,還有個指標型別較少被討論到
因為C#預設是不開放使用指標型別的
除非是在unsafe模式下
主要是在處理實體型別會自動配置記憶體的問題
個人覺得指標型別和參考型別的特性蠻類似的
最大的差別在於指標型別指向記憶體的位置,而參考型別則是指向記憶體的值
如果想更了解指標型別的話可以去研究C/C++這兩種語言
就會有更多關於記憶體的知識喔~


上一篇
[Day10]抵霸閣-常見的HTTP Method簡介
下一篇
[Day12]抵霸閣-人有生老病死 軟體也有其生命周期
系列文
如果可以,我想用30天的時間打造一間抵霸閣30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言