默认情况下,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字符串驻留的问题的更多相关文章

  1. JAVA 字符串驻留池

    一切从String str = new String("abc")说起...    这行代码形式上很简单,其实很复杂.有一个常见的Java笔试题就是问上面这行代码创建了几个Stri ...

  2. .Net字符串驻留池

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

  3. C#中字符串驻留技术

    转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...

  4. C# 字符串驻留池

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

  5. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...

  6. python 的字符串驻留机制

    我们都知道python中的引用计数机制,相同对象的引用其实都是指向内存中的同一个位置,这个也叫做“python的字符串驻留机制”.其他的就不多说了,自行研究. 重点!!!!!! python的引用计数 ...

  7. C#中字符串 "驻留"与Lock(转载)

    class TestWorker 2 {         3     public void DoMultiThreadedWork(object someParameter) 4     { 5   ...

  8. [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考

    发布日期:2008.8.27 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 走钢丝的人,在刺激中体验快感.带着问题思考,在问题 ...

  9. String特性之 “字符串驻留池”

    1. 字符串驻留池,就是一块与堆区并行的存放字符串对象的内存区,JVM的驻留池机制规定: 在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String ...

  10. 深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!

    英文:https://arpitbhayani.me/blogs/string-interning 作者:arpit 译者:豌豆花下猫("Python猫"公众号作者) 声明:本翻译 ...

随机推荐

  1. 设计模式之装饰模式,session共享的底层原理

    前言 还记得当初写spring-session实现分布式集群session的共享的时候,里面有说到利用filter和HttpServletRequestWrapper可以定制自己的getSession ...

  2. Yum搭建LNMP环境(动、静、库分离)(week4_day5)--技术流ken

    前言 本篇博客使用yum来搭建lnmp环境,将采用动态,静态以及数据库分开安装的方式即nginx,php,mysql.会被分开安装在不同的服务器之上,搭建出来一套lnmp环境,并部署wordpress ...

  3. Javascript Cookie小插件

    var ManagerCookie = function(){ //添加cookie function addCookie(key,value,time,path){ key = encodeURI( ...

  4. 我的IdentityServer目录

    概念部分 理解oauth协议 理解什么是claim 学习Identity Server 4的预备知识 Open ID Connect(OIDC)在 ASP.NET Core中的应用 操作部分 入门: ...

  5. C# 操作注册表WindowsRegistry

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...

  6. Ubuntu 18.1远程登录服务器--ssh的安装

    默认的Ubuntu 18.1桌面版没有安装ssh远程登录服务: 打开"终端窗口",输入"sudo apt-get update"-->回车-->&q ...

  7. ubuntu16.4系统和Gentos6.8系统查看开机自启动服务

    ubuntu16.4系统查看自启服务: 需要自行安装一个sysv-rc-conf的工具来查看: sudo apt-get install sysv-rc-conf 查看自启命令: sudo sysv- ...

  8. .Net Core 项目中添加统一的XSS攻击防御过滤器

    一.前言 最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击. 二.XSS简介 ...

  9. [日常] MySQL数据库持久连接

    2018年5月18日 记录: 数据库持久连接: 1.持久的数据库连接是指在脚本结束运行时不关闭的连接.当收到一个持久连接的请求时.PHP 将检查是否已经存在一个(前面已经开启的)相同的持久连接.如果存 ...

  10. [android] activity横竖屏切换的生命周期

    模拟器横竖屏切换,ctrl+f11 界面activity会销毁,重新打开创建 第一种做法: 定死就是横屏 在清单文件,<activity/>节点部分,添加属性,设置屏幕朝向 android ...