首页 > 系统相关 >.NET字符串内存管理:常量字符串、动态创建和字符串池的巧妙结合

.NET字符串内存管理:常量字符串、动态创建和字符串池的巧妙结合

时间:2024-01-20 09:12:56浏览次数:28  
标签:string str2 str1 动态创建 字符串 NET Hello 常量

 

在 .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(...) 都会创建一个新的字符串对象。

总的来说,字符串在内存中的存储方式主要有两种:字符串常量和动态创建的字符串。字符串常量可以共享内存,而动态创建的字符串存储在堆上。字符串池用于存储字符串常量,以便在需要时重用相同的字符串对象,减少内存开销。

 

标签:string,str2,str1,动态创建,字符串,NET,Hello,常量
From: https://www.cnblogs.com/hanbing81868164/p/17976011

相关文章

  • C# 字符串操作指南:长度、连接、插值、特殊字符和实用方法
    字符串用于存储文本。一个字符串变量包含由双引号括起的字符集合示例://创建一个string类型的变量并赋予一个值stringgreeting="Hello";如果需要,一个字符串变量可以包含多个单词:示例:stringgreeting2="Nicetomeetyou!";字符串长度在C#中,字符串实际上是一......
  • 每日一题 2024-1-20 按分隔符拆分字符串
    1.题目(1239)原题链接给你一个字符串数组\(words\)和一个字符\(separator\),请你按\(separator\)拆分\(words\)中的每个字符串。返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串。注意\(separator\)用于决定拆分发生的位置,但它不包含在结果字符串中。拆分......
  • 兴达易控EtherCAT主站转Profinet网关带你轻松实现设备互通
    兴达易控EtherCAT主站转Profinet网关带你轻松实现设备互通XD-ETHPNM20是一款EtherCAT主站功能的通讯网关。EtherCAT主站转Profinet网关主要功能是将EtherCAT的从站设备(伺服、阀门、仪表、变频器等)接入到Profinet网络。XD-ETHPNM20网关连接到EtherCAT总线中作为主站使用,连接到Prof......
  • python之字符串二
    字符串详解                   1. indexdefindex(self,sub,start=None,end=None):#realsignatureunknown;restoredfrom__doc__"""S.index(sub[,start[,end]])->intReturnthelowestindexinSwhere......
  • 洛谷题单指南-模拟和高精度-P1098 [NOIP2007 提高组] 字符串的展开
    原题链接:https://www.luogu.com.cn/problem/P1098题意解读:题目本身是一道模拟题,但是细节点较多,要拿100分,有以下注意点:1、-号两个需要同时为小写字母或者数字,才进行填充2、-号左边>=右边,直接输出-3、对待填充的内容的处理,可以先看是否填充*;小写字母和数字的填充都是前一位asci......
  • dotnet 8项目Docker部署报错 Unhandled exception. Microsoft.Data.SqlClient.SqlExce
    环境:dotnet8+sqlserver2012本地开发调试正常,部署至Docker容器时,运行实例报错。查看日志显示:Unhandledexception.Microsoft.Data.SqlClient.SqlException(0x80131904):Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringth......
  • Kubernetes容器实践操作深度解析
    Kubernetes容器实践深度解析引言在当今云原生时代,容器技术已经成为构建、部署和管理应用程序的关键工具之一。而在众多的容器编排系统中,Kubernetes(简称K8s)因其强大的自动化、弹性和可扩展性而备受欢迎。本文将深入探讨Kubernetes容器实践,从基础概念到高级应用,为读者提供全面的指南......
  • [论文阅读] Progressive Domain Expansion Network for Single Domain Generalization
    ProgressiveDomainExpansionNetworkforSingleDomainGeneralization3.Method本文提出的PDEN用于单域泛化。假设源域为\(\mathcal{S}=\left\{x_i,y_i\right\}_{i=1}^{N_S}\),目标域为\(\mathcal{T}=\left\{x_i,y_i\right\}_{i=1}^{N_T}\),其中\(x_i,y_i\)分别表示第......
  • python第三节:Str字符串类型(8)
    str.strip([chars])返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。如果省略或为None,则 chars 参数默认移除空白符。注意:参数chars 并非作为一个整体,而是会移除参数值的所有组合。在移除字符串前后的指定字符时,遇到不在参数组合中的字......
  • 对象数组,根据字符串字段,并按默认方式排序
    sort在字符串的默认排序,是按unicode字节码排序的,一般字符串的排序可以通过strA.localeCompare(strB)来完成,但我这里必须要按字符串的默认方式排序。list=list.sort((a,b)=>{varjobA=a.Job;varjobB=b.Job;......