千家信息网

c#中String类型的存储原理是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了c#中String类型的存储原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#中String类型的存储原理是什么文章都会有所收获,下面我们一起
千家信息网最后更新 2026年11月02日c#中String类型的存储原理是什么

这篇文章主要介绍了c#中String类型的存储原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#中String类型的存储原理是什么文章都会有所收获,下面我们一起来看看吧。

在我们正式了解c#中的String类型前,先来判断一下下面代码的结果吧~

String str1 = "123";String str2 = str1;str2 = "321";Console.WriteLine(str1);

上面代码的最终输出结果是123,如果有浅学过引用类型的同学一定会问:str2不是在存储的是str1的引用么?那么str2不是和str1指向堆中同一块内存空间么?为什么在引用了str2使其改变数据后再打印出str1最终还是打印出来123?

这也是我最初的疑问,但不要着急,一步一步看下去,相信很快能了解清楚。

在正式开始之前,我们先了解一下c#中的内存分区:

内存分区

  • 栈区:由编译器自动分配释放 ,存放值类型的对象本身,引用类型的引用地址(指针),静态区对象的引用地址(指针),常量区对象的引用地址(指针)等。其操作方式类似于数据结构中的栈。

  • 堆区(托管堆):用于存放引用类型对象本身。在c#中由.net平台的垃圾回收机制(GC)管理。栈,堆都属于动态存储区,可以实现动态分配。

  • (重点看)静态区及常量区:用于存放静态类,静态成员(静态变量,静态方法),常量的对象本身。由于存在栈内的引用地址都在程序运行开始最先入栈,因此静态区和常量区内的对象的生命周期会持续到程序运行结束时,届时静态区内和常量区内对象才会被释放和回收(编译器自动释放)。所以应限制使用静态类,静态成员(静态变量,静态方法),常量,否则程序负荷高。

  • 代码区:存放函数体内的二进制代码。

在c#中,String的存储方式很特殊,在c#的内存中,在常量区里会分配一块空间叫做String暂存池(常量池),在某些时候,我们的字符串数据是存储在这个常量池中的,而地址依然是存放在栈中。

例如用 String str = "xXXXX" 的方式来创建String变量的话,那么String的值便会存储在String常量池中,在我们以这种方式创建String变量时,编译器会先判断你这个内容有没有已经在常量池出现过了,如果已经出现过,那么不会再在常量池中使用空间来存放一个相同的内容,这个内容只会固定有一个引用,所以在创造相同内容的String的时候,他们的引用都是相同的。又有一种情况:一开始A和B内容相同,就是说A与B的引用都相同时,此时将B的内容更改,那么B的内容在常量池中就会使用另一块空间,那么相应的B的引用也会改变,而A的引用并不会改变,因为A此时还是存储的原来的内容。我们可以来看简易的图解:

以上我们可以用代码来证实我们的结论:

String str1 = "123";            String str2 = "123";            Console.WriteLine("此时还未将str1中的值做改变:");            if(object.ReferenceEquals(str1,str2))            {                Console.WriteLine("此时引用相同");            }            else            {                Console.WriteLine("此时引用不相同");            }            if (object.ReferenceEquals(String.Intern(str1), String.Intern(str2)))            {                Console.WriteLine("此时存储在同一块常量池中,且引用相同");            }            else            {                Console.WriteLine("此时两字符串不相同,存在不同的空间中,且引用也不同");            }             Console.WriteLine();            str1 = "12";            Console.WriteLine("此时将str1的值改变,比较str1与str2的引用和所指向的内存空间是否相同:");             if (object.ReferenceEquals(str1, str2))            {                Console.WriteLine("此时引用相同");            }            else            {                Console.WriteLine("此时引用不相同");            }            if (object.ReferenceEquals(String.Intern(str1), String.Intern(str2)))            {                Console.WriteLine("此时存储在同一块常量池中,且引用相同");            }            else            {                Console.WriteLine("此时两字符串不相同,存在不同的空间中,且引用也不同");            }

可以看到最终运行的结果:

为了更好理解以上代码,下面是对代码的一些东西的解释:

object.ReferenceEquals

这个是用来比较两个变量的引用是否一样,如果一样,那么则会返回true,否则将会返回false。

String.Intern

String.Intern的工作方式很好理解,你将一个字符串作为参数使用这个接口,如果这个字符串已经存在池中,就返回这个存在的引用;如果不存在就将它加入到池中,并返回引用。

当然,以上只是针对用String str = "XXXXX";这样创建变量的方式来讨论的,那么什么时候创建String会考虑这样的问题呢?下面来看情况总结:

我们要知道不是所有字符串都放在常量池当中:

存放暂存池:

  • 用字面量值创建String对象,例:String str = "ABCD";

  • 用String.Intern(),例:StringBuilder sb = new StringBuilder("ABCD");string str1 = "ABCD";string str2=string.Intern(sb.ToString);

  • 字符串拼接,例:str1 = "ABCD";str2 = "EFG";str1+str2。

不存放暂存池(存放在堆中):

  • 使用str.Tostring,例:str1 = "ABCD";str2 = str1.ToString();

  • 使用char[].Tostring(),例:str1=ABCD"; char[]charArray = str1.ToArray(); str2 = charArray.ToString();

  • 使用new String(),例:

str1="999";char[] charArray = str1.ToArray();string str2 = new string(charArray);string str3 = new string(charArray);char[] charArray = {'A','B'};str1 = "ABCDE";str2 ="CDE"+charArray.Tostring();char[] charArray1 = {'A','B'};char charArray2 = {'C','D','E'};str1 ="ABCDE";str2=charArray1.ToString()+charArray2.ToString();

关于"c#中String类型的存储原理是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"c#中String类型的存储原理是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

常量 相同 存储 静态 内容 类型 c# 对象 代码 字符 字符串 空间 变量 方式 内存 地址 原理 不同 指针 数据 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 互联网科技图片 广州百单互联网科技有限公司 重生之互联网科技帝国 互联网扶贫科技 金诺互联网科技 互联网科技缩写 时间互联网络科技 科技赋能互联网健康 中国科技互联网公司收入 注册互联网科技公司经营范围大全 每天都有哪些好的互联网科技 互联网营销推广黑科技 吉林省码上互联网科技电话 上海万顺科技互联网有限公司招聘 互联网金融运营模式中的金融科技 互联网科技职业技能培训学校 盐城市攀科互联网科技有限公司 宁波允成互联网科技有限公司 科技互联网企业在行动 上海挚品互联网科技有限公司 有木互联网科技 济南和联互联网科技有限公司 厦门比较好的科技互联网公司 洛阳共同富裕互联网科技有限公司 互联网金融科技公司的优势 互联网科技包装股 普陀区互联网教育科技管理办法 杭州融税互联网科技有限公司 武汉亿视互联网科技有限公司
0