关于.NET字符串驻留的问题

默认情况下,CLR会把字符串常量保存在字符串池中。
.NET 2.0引入了CompilationRelaxations.NoStringInterning枚举成员。这个枚举CompilationRelaxationsAttribute属性配合使用可以把程序集标记为“不要求字符串字面量驻留”(marks an assembly as not requiring string-literal interning)。
从字面意思理解,应用[assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]这个属性好像没有强制性的意思。也就是说,CLR的JIT可以选择忽略此属性。

我在.NET 4.0和4.6上都测试了。但是,结果是一样的。不管有没有加[assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]这个属性,字符串都会驻留在内存中。

MSDN中的String.Internal方法的说明中有一句话“The reason is that the CLR‘s reference to the interned String object can persist after your application, or even your application domain, terminates.”。根据这句话理解,即使应用程序结束,甚至即使应用程序域终止了,CLR的驻留字符串引用依然存在。

所以有如下两个可能:
1,CLR的JIT忽略了[assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]这个属性。
2,应用程序终止了,但是CLR的驻留字符串引用依然存在。

但是,我更换了好几个字符串的值,结果仍旧不变。
所以第二种可能性显然不成立(最起码在我测试的时候不成立)。
所以,应该是CLR的JIT忽略了[assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]这个属性。
应用CompilationRelaxations.NoStringInterning对CLR来说不是强制性的。

以下是测试代码:

 1 [assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]
 2 namespace StringInterningTest
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             string s1 = "unicode";
 9             string s2 = new string(new char[] { ‘u‘, ‘n‘, ‘i‘, ‘c‘, ‘o‘, ‘d‘, ‘e‘ });
10             string s3 = "unicode";
11
12             bool b1 = (object)s1 == (object)s2;
13             bool b2 = (object)s1 == (object)s3;
14         }
15     }
16 }

测试结果:
n1的值始终为"unicode"。
n2的值始终为null。

如有不正确的地方,希望各位指正!

时间: 2024-12-07 08:34:06

关于.NET字符串驻留的问题的相关文章

字符串驻留池的另类用法

起因 事情的起因是这样的 基于某些无法避免的因素 我有2个dll 暂且叫 a.dll 和 b.dll 这2个类库中有一部分完全相同的代码(下文中称为代码C)——遍历当前应用程序下的所有类库文件,并注入插件(没错,就是IOC了) 当开发人员仅引用a.dll或仅b.dll的时候,并没有任何问题 但是如果一个项目需要同时引用 a.dll 和 b.dll 那么麻烦就来了 那部分完全相同的代码会被执行2次, 所有插件都会被加载2次 经过 最简单的方案当然是把a.dll和b.dll中相同的代码 抽出成c.d

JAVA 字符串驻留池

一切从String str = new String("abc")说起...    这行代码形式上很简单,其实很复杂.有一个常见的Java笔试题就是问上面这行代码创建了几个String对象.    我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象.下面说明为什么创建了两个String对象.    首先,来了解一下Java中的字符串驻留池的概念.JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:  

python 的字符串驻留机制

我们都知道python中的引用计数机制,相同对象的引用其实都是指向内存中的同一个位置,这个也叫做“python的字符串驻留机制”.其他的就不多说了,自行研究. 重点!!!!!! python的引用计数机制,并不是对所有的数字,字符串,他只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的. 看下图: 当字符串中没有特殊字符时(‘abc’),引用指向同一对象: 当字符串中有特殊字符时(‘-a

Python中的字符串驻留

C#中的字符串驻留 熟悉.NET的人都应该知道C#中的字符串驻留机制,.NET维护了一个驻留池,它会把在编译期间就相同的字符串只保留一份拷贝.如果仅在运行期间值才相同的字符串变量,.NET不会为这个2个相同的字符串变量指向同一份引用的.不过.NET提供了一个方法,让开发人员可以强制将两个相同的字符串指向同一个引用,使用String类中的Intern方法. string s1 = "!QAZ2wsx3$%5$$%fe _ ###[email protected]"; string s2 

(一)Python入门-2编程基本概念:18字符串-驻留机制-内存分析-字符串同一判断-值相等判断

一:字符串驻留 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中. Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_).字母 和数字)会启用字符串驻留机制驻留机制. 二:字符串比较和同一性 我们可以直接使用==,!=对字符串进行比较,是否含有相同的字符. 我们使用is / not is,判断两个对象是否为同一个对象.比较的是对象的地址,即 id(obj1)是 否和 id(obj2)相等. 三:成员操作符 in /not in 关键字,判断某个字符(

.Net字符串驻留池

在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量地址指向新创建的字符串地址. string s1 = "Hello"; string s2 = "Hello"; bool b = Object.ReferenceEquals(s1, s2); Console.WriteLine(b); //输入 True 它们是同一

.net 字符串驻留

.net中的string表达的是常量字符串. JIT编译器编译时判断遇到的常量字符串是否在内部散列表中,如果不在,添加进去.当第一次执行到含字符串的方法时,CLR会检查该字符串是否在内部的一个散列表中,这个散列表的key是字符串,value是字符串的引用,如果不在就增加一个对该字符串的条目进去,如果在直接取其引用即可. 还可以通过string Intern(string str)方法把一些动态字符串加入到内部散列表中,实现驻留.

什么是string interning(字符串驻留)以及python中字符串的intern机制

Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when

十个最常见的Java字符串问题

翻译自:Top 10 questions of Java Strings 1.怎样比较字符串?用"=="还是用equals()? 简单地说,"=="测试两个字符串的引用是否相同,equals()测试两个字符串的值是否相同.除非你希望检查两个字符串是否是同一个对象,否则最好用equals(). 如果你知道字符串驻留机制会更好. 2.为什么对于安全性敏感的信息char[]要优于String? 字符串是不变的,这也就意味着字符串一旦被创建,它们将一直保持在那直到被垃圾回收