.NET字元串記憶體管理:常量字元串、動態創建和字元串池的巧妙結合

来源:https://www.cnblogs.com/hanbing81868164/p/17976011
-Advertisement-
Play Games

在 .NET 中,字元串是不可變的,這意味著一旦創建,字元串的內容就不能被修改。字元串在記憶體中以不同的方式存儲,具體取決於它是常量字元串還是動態創建的字元串。 常量字元串 常量字元串在編譯時就被解析,併在程式的元數據(Metadata)中存儲。多個相同的字元串常量可能會共用同一塊記憶體。 string ...


 

在 .NET 中,字元串是不可變的,這意味著一旦創建,字元串的內容就不能被修改。字元串在記憶體中以不同的方式存儲,具體取決於它是常量字元串還是動態創建的字元串。

常量字元串

常量字元串在編譯時就被解析,併在程式的元數據(Metadata)中存儲。多個相同的字元串常量可能會共用同一塊記憶體。

string str1 = "Hello, ";
string str2 = "World!";

// 編譯時已知的字元串常量在元數據中被共用
string concatenated = str1 + str2;

Console.WriteLine(concatenated); // 輸出:Hello, World!

動態創建的字元串

動態創建的字元串通過堆記憶體進行存儲。每當我們對字元串進行修改時,實際上是創建了一個新的字元串對象,而原始的字元串對象保持不變。

string str = "Hello";
str += ", World!";

Console.WriteLine(str); // 輸出:Hello, World!

在上述例子中,str 的值在拼接後發生了變化,但實際上是創建了一個新的字元串對象,而原始的 "Hello" 字元串對象保持不變。

字元串池

.NET 框架使用了一個稱為字元串池(String Pool)的機制,它是一個位於堆中的數據結構,用於存儲字元串常量以及通過 string.Intern() 方法放入池中的字元串。字元串池的目的是為了重用字元串常量,減少記憶體的使用。

string str1 = "Hello";
string str2 = "Hello";

bool areEqual = (str1 == str2); // true,因為它們指向字元串池中的同一對象

在這個例子中,str1 和 str2 實際上指向了字元串池中的同一對象,因此它們的內容相等。

string str1 = new string("Hello".ToCharArray());
string str2 = new string("Hello".ToCharArray());

bool areEqual = (str1 == str2); // true,因為它們的內容相等
bool referenceEqual = object.ReferenceEquals(str1, str2); // false,它們不指向同一對象

在這個例子中,str1 和 str2 的內容相等,但它們不是同一對象,因為每次使用 new string(...) 都會創建一個新的字元串對象。

總的來說,字元串在記憶體中的存儲方式主要有兩種:字元串常量和動態創建的字元串。字元串常量可以共用記憶體,而動態創建的字元串存儲在堆上。字元串池用於存儲字元串常量,以便在需要時重用相同的字元串對象,減少記憶體開銷。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Rust 所有權和 Move 語義 所有權和生命周期是 Rust 和其它編程語言的主要區別,也是 Rust 其它知識點的基礎。 動態數組因為大小在編譯期無法確定,所以放在堆上,並且在棧上有一個包含了長度和容量的胖指針指向堆上的記憶體。 恰到好處的限制,反而會釋放無窮的創意和生產力。 Rust 所有權規 ...
  • UAC(User Account Control) 是 Windows 平臺的用戶許可權控制。它可以讓程式使用管理員許可權執行某些操作。 靜態 UAC 提權 靜態 UAC 提權讓程式一直運行在管理員許可權下,只要在項目設置里把 "UAC Execution Level" 設置為 "requireAdmin ...
  • Spring AOP 技術實現原理 在Spring框架中,AOP(面向切麵編程)是通過代理模式和反射機制來實現的。本文將詳細介紹Spring AOP的技術實現原理,包括JDK動態代理和CGLIB代理的使用,並通過實例演示其在實際項目中的應用。 1. AOP的實現原理概述 Spring AOP的實現基 ...
  • 本文致力於,讓編程者一步步明白書寫一個JavaWeb項目應該做些什麼,梳理清楚流程框架,需要的jar包,同時手寫了一個分頁工具類也在其中,讓你在編程中更加絲滑。 ...
  • 在 C++11 中,原子變數(std::atomic)提供了一種線程安全的方式來操作共用變數。下麵是一個簡單的例子,演示了C++11原子變數的用法。 #include <iostream> #include <atomic> #include <thread> std::atomic<int> co ...
  • 小北說在前面: 在一線互聯網企業種,如網易、美團、位元組、如阿裡、滴滴、極兔、有贊、希音、百度、美團等大廠,資料庫的面試題,一直是核心和重點的提問點,比如前段時間有位小伙伴面試位元組,就遇到了下麵這道面試題: 索引的設計規範,你知道那些? 小伙伴雖然用過索引,但是索引的設計規範忘記得一干二凈,回答也是朦 ...
  • ELK的架構有多種,本篇分享使用的架構如圖所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生產環境一天幾千萬的日誌,記憶體占用大概 10G ...
  • 本文向大家介紹了最小二乘法以及公式推導的過程,並使用C#與Python進行實現。重點介紹了C#中是如何實現的,同時介紹了在C#中如何使用OxyPlot繪圖。希望對你有所幫助。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...