关于.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来说不是强制性的。
以下是测试代码:
[assembly: CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]
namespace StringInterningTest
{
class Program
{
static void Main(string[] args)
{
string s1 = "unicode";
string s2 = new string(new char[] { 'u', 'n', 'i', 'c', 'o', 'd', 'e' });
string s3 = "unicode"; bool b1 = (object)s1 == (object)s2;
bool b2 = (object)s1 == (object)s3;
}
}
}
测试结果:
n1的值始终为"unicode"。
n2的值始终为null。
如有不正确的地方,希望各位指正!
关于.NET字符串驻留的问题的更多相关文章
- JAVA 字符串驻留池
一切从String str = new String("abc")说起... 这行代码形式上很简单,其实很复杂.有一个常见的Java笔试题就是问上面这行代码创建了几个Stri ...
- .Net字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...
- C#中字符串驻留技术
转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...
- C# 字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...
- Java中的字符串驻留
转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...
- python 的字符串驻留机制
我们都知道python中的引用计数机制,相同对象的引用其实都是指向内存中的同一个位置,这个也叫做“python的字符串驻留机制”.其他的就不多说了,自行研究. 重点!!!!!! python的引用计数 ...
- C#中字符串 "驻留"与Lock(转载)
class TestWorker 2 { 3 public void DoMultiThreadedWork(object someParameter) 4 { 5 ...
- [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
发布日期:2008.8.27 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 走钢丝的人,在刺激中体验快感.带着问题思考,在问题 ...
- String特性之 “字符串驻留池”
1. 字符串驻留池,就是一块与堆区并行的存放字符串对象的内存区,JVM的驻留池机制规定: 在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String ...
- 深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
英文:https://arpitbhayani.me/blogs/string-interning 作者:arpit 译者:豌豆花下猫("Python猫"公众号作者) 声明:本翻译 ...
随机推荐
- centos7安装kafka_2.11
1.下载 官网地址:http://kafka.apache.org/downloads.html 下载:wget https://www.apache.org/dyn/closer.cgi?path= ...
- 详细介绍MySQL/MariaDB的锁
官方手册:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.html 1.事务提交的方式 在MariaD ...
- spark之JDBC开发(连接数据库测试)
spark之JDBC开发(连接数据库测试) 以下操作属于本地模式操作: 1.在Eclipse4.5中建立工程RDDToJDBC,并创建一个文件夹lib用于放置第三方驱动包 [hadoop@CloudD ...
- Zookeeper(一) —— 环境搭建
一.概述 集中式 向 分布式演变,高并发.海量存储 应用场景: * 数据发布.订阅的两种方式:推模式.拉模式 * 命名服务 * 分布式协调/通知(心跳检测) * 负载均衡 自增长id和uuid的缺点, ...
- [转]js 取得 Unix时间戳(Unix timestamp)
本文转自:https://blog.csdn.net/o0snow/article/details/6858829 js 取得 Unix时间戳 Unix时间戳(Unix timestamp),或称Un ...
- IdnentiyServer-使用客户端凭据访问API
情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限. 客户端通过clientid和secrect访问iden ...
- .NET MVC后台发送post请求
一.WebRequest方式 //设置请求接口 var request = (HttpWebRequest)WebRequest.Create("http://xxx.com/xxx&quo ...
- 建立uboot,内核的SI工程(1)
1. 建立Uboot的SI工程1.1首先给uboot打上补丁,然后来生成压缩文件 tar cjf u-boot- 1.2 编译uboot make 100ask24x0_config //使用打好补丁 ...
- java体系架构
java概念 java本身是一种面向对象的语言,最显著的特性有两方面,一是所谓的“书写一次,到处运行”(write once ,run anywhrer),能够非常容易的获得跨平台能力,另外就是垃圾收 ...
- python基础学习(二)注释和算术运算符
注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...