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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# - 值类型、引用类型走出误区,容易错误的说法

發布時間:2025/4/5 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# - 值类型、引用类型走出误区,容易错误的说法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# - 值類型、引用類型&走出誤區,容易錯誤的說法

?

1. 值類型與引用類型小總結

1)對于引用類型的表達式(如一個變量),它的值是一個引用,而非對象。

2)引用就像URL,是允許你訪問真實信息的一小片數據。

3)對于值類型的表達式,它的值是實際的數據。

4)有時,值類型比引用類型更有效,有時恰好相反。

5)引用類型的對象總是在堆上,值類型的值既可能在棧上,也可能在堆上,具體取決于上下文。

6)引用類型作為方法參數使用時,參數默認是以‘值傳遞’方式來傳遞的,但值本身是一個引用。

7)值類型的值會在需要引用類型的行為時裝箱;拆箱則是相反的過程。

?

2. 誤區一 結構是輕量級的類

這個誤解存在著多種形式。有人認為值類型不能或不應有方法或有其他意義的行為:它們應作為簡單的數據轉移類型來使用,只應該有public字段或簡單的屬性。對于這種說法,一個非常典型的反例就是Datetime類型。DateTime作為值類型來提供是很有道理的,因為它非常適合作為和數字或字符相似的一個基本單位來使用。另外,它也理應被賦予對它的值執行計算的能力。換個角度來看這個問題,是數據轉移類型一般都是引用類型。總之,具體應該如何決定,應取決于需要的是值類型的語義,還是引用類型的語義,而不是取決于這個簡單類型與否。

還有一些人認為值類型之所以顯得比引用類型‘輕’,是因為性能,事實是在某些情況下,值類型很能‘干’:它們不需要垃圾回收,(除非被裝箱)不會因類型標識而產生開銷,也不需要解引用。但在其他方面,引用類型顯得更‘能干’:在傳遞參數、賦值、將值返回和執行類似的操作時,只需復制4或8字節(需要看運行的是32位或是64位CLR),而不是復制全部數據。假定ArrayList是一個所謂‘純的’值類型,那么將一個ArrayList表達式傳給一個方法時,就得復制它的所有數據!幾乎在所有情況下,性能問題都不是根據這種判斷來決定的。瓶頸從來都不是想當然的,在你根據性能進行設計之前,需要衡量不同的選擇。

值得注意的是,將這兩者相結合也不能解決問題:類型(不管是類還是結構)擁有多少方法并不重要,每個實例所占用的內存不會受到影響。(代碼本身會消耗內存,但這只會發生一次,而不是每個實例都發生)

?

3. 誤區二 引用類型保存在堆上,值類型保存在棧上

這個誤區主要應歸咎于轉述這句話的人根本沒有動腦筋。這一部分是正確的,引用類型的實例總是在堆上創建的。但第二部分就有問題了。

前面講述過,變量的值是在它聲明的位置存儲的。所以,假定一個類中又一個int類型的實例變量,那么在這個類中的任何對象中,該變量的值總是和對象中的其他數據在一次,也就是在堆上。只有局部變量(方法內部聲明的變量)和方法參數在棧上。對于C#2或以上版本,很多局部變量并不完全存放在棧中。

?

4. 誤區三 對象在C#中默認是通過引用傳遞的

這或許是傳播得最廣的一個誤區了。統一說這句話的人一般知道C#實際的行為是什么,但不知道‘引用傳遞pass by reference’的真正意思是什么。可惜,那些真正知道引用傳遞是什么意思的人,在聽到這句話時會被完全搞糊涂。

‘引用傳遞’的正式定義相當復雜,要涉及坐值(1-values)和類似的計算機科學術語。但最重要的一點是,假如以引用傳遞的方式來傳送一個變量,那么調用的方法可以通過更改其參數值,來改變調用者的變量值。現在請記住,引用類型變量的值是引用,而不是對象本身。不需要按引用來傳遞參數本身,就可以更改該參數的引用的那個對象的內容。例如,下面的方法更改了相關對象StringBuilder的內容,但調用者的表達式引用的仍然是之前的那個對象:

public void AppendHello(StringBuilder builder){builder.Append("Hello");}

調用這個方法時,參數值(對StringBuilder的一個引用)是以值傳遞pass by value 的方式傳遞的。如果想在方法內部更改builder變量的值,如執行builder=null 語句,調用者看不見這個改變,剛好跟錯誤認識相反。

有趣的是,這種錯誤說法中,不僅引用傳遞的說法有誤,而且 對象傳遞的說法也存在問題。無論引用傳遞還是值傳遞,永遠不會傳遞對象本身。涉及一個引用類型時,要么以引用傳遞的方式傳遞變量,要么以傳值的方式傳遞參數值(引用)。最起碼,這回答了‘當null作為一個傳值參數的值來使用時會發生什么’的問題。假如傳遞的是對象,這是就會出問題,因為沒有一個對象可供傳遞!相反,null引用會采用和其他引用一樣的值傳遞方式傳遞。

?

可以關注本人的公眾號,多年經驗的原創文章共享給大家。

posted on 2017-01-06 16:45 alun-chen 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/alunchen/p/6256903.html

總結

以上是生活随笔為你收集整理的C# - 值类型、引用类型走出误区,容易错误的说法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品亚洲一区二区三区四区五区 | 后入内射无码人妻一区 | 国产成人精品国内自产拍免费看 | 丁香婷婷色| 国产精品一区在线播放 | 少妇高潮露脸国语对白 | 97精品自拍| 99久久99久久精品免费看蜜桃 | 国产精品无码久久久久久电影 | 激情文学88 | 性感美女一区 | 香蕉视频色 | 欧州一区二区 | 欧美一级色图 | 午夜a级片| 日韩www在线观看 | 九九黄色大片 | 欧美性猛交乱大交 | 成av人片一区二区三区久久 | 96精品视频 | 一区二区在线观看视频 | 1000部啪啪未满十八勿入超污 | 成人精品福利视频 | 欧美成人乱码一二三四区免费 | 美女脱光衣服让男人捅 | 91丝袜| 国产免费又爽又色又粗视频 | 九九视频免费 | 色老板精品凹凸在线视频观看 | 久久久久网站 | 撕开少妇裙子猛然进入 | 色播久久 | 欧美精品 日韩 | 天天干夜夜骑 | 人妖天堂狠狠ts人妖天堂狠狠 | 国产乱xxⅹxx国语对白 | 蜜桃色av | 在线亚洲免费 | 亚洲精品97久久 | 免费在线h| 日韩va在线观看 | 免费污视频 | www.97超碰 | 成人免费观看视频大全 | 欧美日韩生活片 | 免费av动漫| 亚洲精品大片 | 久久人久久 | 高hhhhh| 日本精品一区二区三区四区的功能 | 欧美性aaa | 全黄一级裸体片 | 欧美亚洲国产日韩 | 在线www| 小宵虎南在线观看 | 老鸭窝一区二区 | 激情网久久| 奇米精品一区二区三区在线观看一 | a黄视频| 男男啪啪网站 | 国产一级一片免费播放放a 丁香六月色 | 麻豆md0077饥渴少妇 | 一本一道精品欧美中文字幕 | 国产做受69 | 久久精品4| 一级美女大片 | 午夜精品视频在线观看 | 精品国产三级片在线观看 | 成人一二三四区 | 亚洲精品一区久久久久久 | 熟女丰满老熟女熟妇 | 成人黄色三级 | 欧美老女人性生活 | 欧美性生交xxxxx | 国产伦理在线观看 | 先锋av资源在线 | 综合色综合 | 粉嫩av懂色av蜜臀av分享 | 精品少妇人妻AV无码专区在线 | 成人三级图片 | 成人欧美一区二区三区黑人 | 在线免费观看日本 | 中文字字幕 | 天天爽天天搞 | av中文字幕不卡 | 日韩欧美精品在线播放 | 娇喘顶撞深初h1v1 | 高潮白浆女日韩av免费看 | 亚洲精品久久久蜜桃网尤妮丝 | 伊人天天 | av网站一区二区 | 欧美少妇一级片 | 精品人妻一区二区免费 | 69视频在线看 | 日韩在线精品视频一区二区涩爱 | 中文字幕亚洲一区二区三区五十路 | 把高贵美妇调教成玩物 | 成人一区二区三区在线观看 | 日本aⅴ在线观看 |