日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

再聊一次值类型和引用类型

發布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再聊一次值类型和引用类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#值類型,作為函數形參,形參被修改,不影響原值。

這是我們在初始學習編程時需要記住的內容,我們也是一直這樣踐行的。

先說結論:這是不準確的。


為什么提出這樣看似很淺顯的問題,是因為有次我在使用ArraySegment<byte>值類型時,有感而發。

這是一個托管的值類型,表示array的一個片斷, 在用做websocket接收數據的載體時我發現每次值傳遞后, 這個ArraySegment<byte>貌似發生了變化。這勾起了我的探究欲。

我們做一個簡單的實驗, 來證明【值類型作為函數形參, 形參被修改,不影響原值】不準確。

struct?Slice?{public?Array?Array?{?get;?set;?}public?int?Offset?{?get;?set;?}public?int?Count?{?get;?set;?}}class?Program{static?void?Main(string[]?args){var?slice?=?new?Slice?{?Array?=?Array.CreateInstance(typeof(int),?5)};Test(slice);foreach(var?i??in?slice.Array){Console.WriteLine(i);?}Console.ReadLine();}// 值類型傳參,值傳給tmp變量static?void?Test(Slice?tmp){tmp.Array.SetValue(1,1);tmp.Offset?=?1;tmp.Count?=?1;}}//?輸出??0?1?0?0?0slice變量的引用類型屬性體現了變化,值類型Offset Count屬性不會變化。

這個簡單的Demo告訴我們:

大部分情況下:“值類型作為函數形參,形參被修改,不影響原值”, 但是如果修改的是值類型的引用類型字段,原值類型照樣能體現修改。

歸根到底由值類型和引用類型的特性決定:

值類型的變量直接存儲數據,而引用類型的變量持有的是數據的引用,數據存儲在數據堆中;

寬泛地講:函數傳參,都是值傳遞(拷貝), 只是引用類型傳遞的是原對象的引用或地址值。

本篇文章沒啥干貨,算是日常小記吧,各大佬輕噴。

基礎不牢 地動山搖

??面試官:實現一個帶值變更通知能力的Dictionary

?你管這叫"線程安全"?

?ASP.NET Core端點路由中三種讓人困惑的路由函數

?你怕是對MD5算法有誤解

?String是一個奇怪的引用類型

?難纏的布隆過濾器,這次終于通透了

總結

以上是生活随笔為你收集整理的再聊一次值类型和引用类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。