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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

String是一个奇怪的引用类型

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

點擊藍字

關注我們

開局兩張圖,內容全靠刷。

馬甲哥看到這樣的現象,一開始還是有點懵逼。

這個例子,string是純粹的引用類型,但是在函數傳值時類似于值傳遞;我之前給前后示例的內存變化圖吧:

根因就是大多數高級語言都把String設計成不可變的: 由一個字符串池管理字符串面值。

為什么被設計成不可變。

這個我還真的搜索了一下[1]

總結起來:

  • string 被設計為不可變, 是因為 string在現代任何語言中,使用很頻繁:多個對象可能都是這個字符面值, 然后就設計一個Pool來存儲string。
    既然pool里面共享字符面值,修改的時候又不能影響到別人,那就只好重新拷貝產生新的字符面值。

  • 不可變資源消除了多線程中的資源競爭:對于文本的修改都會導致創建新空間,因此在多個線程同時訪問文本無需設置鎖,這對高頻使用的String很友好。

  • 字符串不變性對于[在哈希表中使用字符串作為鍵]很友好,需要計算哈希值的對象必須是不可變的,以確保哈希值不變。

    • 一個有意思的現象是:String雖然是引用類型,字符串對比時卻表現的像值類型

    string?str1="FooFoo"; string?strFoo="Foo"; string?str2=?strFoo?+?strFoo; return?str1?==?str2;???????????//??返回true

    正因為String不可變性 & Pool的機制,頻繁變更字符串,會在池中產生很多臨時的不用的字符串,所以我們有了優化的套路:

    StringBuilder

    代表可變的字符串,一旦修改不會嘗試創建新對象,而是動態擴展內存

    var?ss?=?new?StringBuilder("Hello?",?100);??//?初次字符容量100 ss.Append("www.cnblogs.com"); Console.WriteLine(ss.ToString());??// ss打印結果為:222

    Span

    Span該出圈了,
    Span提供對內存連續區域的類型安全訪問,該內存可以位于堆、堆棧、甚至是非托管內存;
    與String不可變性相關的是ReadOnlySpan(值類型), 提供內存數據的只讀視圖,每次切片不會產生新對象,而是在已存在的連續空間上創造新的視圖。

    var?text?=?"https://www.cnblogs.com/JulianHuang/p/14817621.html"; ReadOnlySpan<char>?nameSpan?=?text.AsSpan(8,?15); nameSpan?=?nameSpan.Slice(4,7); Console.WriteLine(nameSpan.ToString());

    總結輸出

    今天從兩張詭異的編程圖聊到了String的不可變性、內存分布, 延伸談到了

  • String不可變性的設計設計考量(有先射箭再畫靶的嫌疑??)

  • 針對頻繁修改的String如何做內存優化

  • 不是自吹,文章內容在業界相當硬核(多次被各大佬/CSDN點贊/轉載),閱讀和關注不是目的,更希望得到更多的閱讀反饋,互相促進認知的提升(相當真誠??)。

    參考資料

    [1]

    這個我還真的搜索了一下: https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/

    # 更多精彩

    • 面試八股文:你寫過自定義任務調度器嗎?

    • 看過這么多爆文,依舊走不好異步編程這條路?

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

    • 墻裂推薦:這可能是CAP理論的最好解釋

    • 全網最通透的“閉包”認知 · 跨越語言

    • 鵝廠二面,Nginx回憶錄

    • 實話實說:只會.NET,會讓我們一直處于鄙視鏈、食物鏈的下游

    • 什么是云原生?

    今天因為你的點贊,讓我元氣滿滿!

    總結

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

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