1. 程式人生 > 其它 >.NET 6 中 gRPC 的新功能

.NET 6 中 gRPC 的新功能

寫在前面

原文出處,原文大佬講的很細緻明瞭,此文相當於讀書筆記

0x00 資料

拷貝的概念用於引用資料型別真實的資料存放在堆記憶體當中),淺拷貝類似於變數的賦值,只是將內部的值 copy 一份,但並不要將淺拷貝的理解止步於此,不然會出問題的!

程式中的資料可以分為兩類:

  1. 基本資料型別:也即常見的 int, double, string...... 之類的程式語言明確宣告的基本資料型別
  2. 引用資料型別:除基本型別外的所有資料都是引用資料型別,我們為其宣告的變數名裡存的指標指向的只是他在棧中的記憶體地址,而真正的資料實體存在於堆記憶體當中,當我們通過變數名來使用引用物件時,編譯器首先檢索的是棧中的地址,然後再去堆中取出相應的資料實體。

0x01 深拷貝和淺拷貝

1、淺拷貝

上文說到過,淺拷貝類似於賦值。賦值的概念是對於基本資料型別來說的,他們的值都存在棧中,將一個基本資料型別變數值賦給另外一個基本資料型別變數時,編譯器會完全複製他所指向棧地址當中所儲存的資料,而基本資料型別指向的棧中儲存的就是資料實體。所以在引用型別中的基本資料型別上,淺拷貝和賦值其實是一樣的。

但是!引用型別當中也可以存在其他的引用型別,對於這些資料跟上面就有區別了。

引用型別的淺拷貝依然是複製其在棧中的值,但是引用型別指向的棧記憶體中存的並不是資料實體,而是該實體在堆記憶體中的地址,這樣的拷貝就會讓兩個物件指向同一塊堆記憶體當中的資料實體。那麼其中一個物件對實體進行更改,勢必會影響到其他同樣指向該實體的物件。這也正是淺拷貝與複製的區別所在。

2、深拷貝

深拷貝較於淺拷貝就比較好理解了,他會直接把所有的資料直接新建一份一樣的,這份資料在棧和堆中都是不一樣的地址(儘管他們的資料都是相同的),那麼這樣的拷貝方式顯然不會影響到原資料。