千家信息网

.NET中的字符串驻留池是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下.NET中的字符串驻留池是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在.NET中,对于相同的字符
千家信息网最后更新 2026年11月03日.NET中的字符串驻留池是什么

小编给大家分享一下.NET中的字符串驻留池是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在.NET中,对于相同的字符串,.NET会将它们指向同一个地址,它们是相同的实例。.NET中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.NET实际上是新创建一个字符串,而将变量地址指向新创建的字符串地址。

看下面的一个例子:

using System;namespace ConsoleApp2{    class Program    {        static void Main(string[] args)        {            string str1 = "hello";            string str2 = "hello";            bool tf = object.ReferenceEquals(str1, str2);            Console.WriteLine(tf);            Console.ReadKey();        }    }}

程序执行结果

从执行结果我们可以得出结论:str1和str2指向同一个内存对象,它们是同一个实例。

在.NET中,CLR默默地维护了一个叫做驻留池(Intern Pool)的表。这个表记录了所有在代码中使用字面量声明的字符串实例的引用。这说明使用字面量声明的字符串会进入驻留池,而其他方式声明的字符串则不会进入驻留池,也就不会自动享受到CLR防止字符串冗余的机制的好处了。

看下面一个例子

using System;using System.Text;namespace ConsoleApp2{    class Program    {        static void Main(string[] args)        {            StringBuilder sb = new StringBuilder();            sb.Append("he").Append("llo");            string str1 = "hello";            string str2 = sb.ToString();            bool tf = Object.ReferenceEquals(str1, str2);            Console.WriteLine(tf);            bool tf1 = str1 == str2;            Console.WriteLine($"str1和str2的内容是否相同:{tf1}");            Console.ReadKey();        }    }}

程序执行结果

这里输出了False。虽然str1和str2是相同的字符串,但是由于str2不是通过字面量的方式声明的,CLR在为ToString()返回值分配内存时,并不会到驻留池中去检查是否有值为"hello"的字符串已经存在了,所以也不会让str2指向驻留池中的对象。

如果希望强制CLR检查驻留池,以避免冗余的字符串副本,String类的设计者提供了一个名为Intern的类方法。下面是该方法的一个实例

using System;using System.Text;namespace ConsoleApp2{    class Program    {        static void Main(string[] args)        {            StringBuilder sb = new StringBuilder();            sb.Append("he").Append("llo");            string str1 = "hello";            // 在这里强制检查字符串驻留池            string str2 = string.Intern(sb.ToString());            bool tf = Object.ReferenceEquals(str1, str2);            // 输出True,因为检查驻留池时,发现字符串已经存在            Console.WriteLine(tf);            bool tf1 = str1 == str2;            Console.WriteLine($"str1和str2的内容是否相同:{tf1}");            Console.ReadKey();        }    }}

程序执行结果

Intern方法接受一个字符串作为参数,它会在驻留池中检查是否已经存在参数所表示的字符串。如果存在,则返回那个驻留池中的字符串的引用;否则向驻留池中加入一个新的表示相同值的字符串,并返回这个字符串的引用。

不过要注意的是,就算Intern方法在驻留池中找到了相同值的字符串,也不能让您省却一次字符串内存分配的操作,因为作为参数的字符串已经被分配了一次内存了。使用Intern方法的好处在于,如果Intern方法在驻留池中找到了相同值的字符串,此时虽然在内存中存在两份该字符串的副本(一份是参数,一份是驻留池中的),但是随着时间的流逝,参数所引用的那个副本会被垃圾回收掉,这样对于该字符串内存中就不存在冗余了。

当你的程序中存在某个方法,可以根据不同的上下文环境创建并返回一个很长的字符串,而在程序运行的过程中它会经常返回同样的字符串时,你可能就要考虑使用Intern方法来提高内存的使用率了。不过同样值得注意的是,使用Intern方法让一个字符串存留于驻留池中也有一个副作用:即使已经不存在任何其它引用指向驻留池中的字符串了,这个字符串仍然不一定会被垃圾回收掉。也就是说即使驻留池中的字符串已经没有用处了,它可能也要等到CLR终结时才被销毁。当你使用Intern方法的时候,也应该考虑到这个特殊的行为。

以上是".NET中的字符串驻留池是什么"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

字符 字符串 方法 相同 内存 参数 指向 程序 检查 内容 实例 结果 冗余 副本 地址 字面 篇文章 分配 例子 变量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技名片 华服互联网科技怎么样 互联网巨头反垄断金融科技 互联网中国科技 互联网金融公司科技 深圳齐家互联网科技 顺网科技2021年互联网排名 济南和联互联网科技有限公司 互联网为啥属于高科技 南平创想时代互联网科技有限公司 成都互联网科技公司工作好不好 互联网科技创新的路径 卓翼科技产业互联网合作 科技互联网的核心竞争力 四川互联网展示科技馆设计 富国互联网科技002692 本届互联网大会上的黑科技 中国科技和美国互联网 易租星互联网科技有限公司 唐山双旺合互联网科技产业园 山东特亿宝互联网科技有限公司 广州互联网科技公司 智网互联网科技 互联网科技作文 上海致骋互联网科技 互联网科技博客 银川新华互联网科技职业技术培训学校图片 上海乐五互联网科技有限公司 美国五大互联网科技公司市值多少 现代互联网科技公司
0