.NET中的字符串驻留池是如何实现高效内存管理的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1023个文字,预计阅读时间需要5分钟。
在.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防止字符串冗余的机制的好处了。
本文共计1023个文字,预计阅读时间需要5分钟。
在.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防止字符串冗余的机制的好处了。

