知识大全 对 String 的几个错误认识[1]
Posted 变量
篇首语:鸟欲高飞先振翅,人求上进先读书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 对 String 的几个错误认识[1]相关的知识,希望对你有一定的参考价值。
对 String 的几个错误认识[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
昨天调试一段程序发现内存始终释放不掉 最后终于发现是对String 的错误使用造成 这促使我今天又仔细研究了一下String类型 不研究不知道 一研究发现我过去对String 的很多认识都是错误的 感觉这种错误认识还比较有典型性 于是写下此文和大家一起探讨
String 类型变量追加 或修改后的新String对象是驻留(Interned)的
如下面代码
string s = abcd ;string s = s + e ;我过去想当然的认为s 是驻留的 但实际上并非如此 用 string IsInterned 方法检测s 是非驻留的 后来研究发现只有常量字符串才会默认驻留 其他的字符串变量哪怕是采用 new string 构造出来的 默认都非驻留 除非用string Intern 强行驻留 后面我将提到驻留对内存的影响 微软之所以不让所有的字符串都驻留 我认为还是处于内存方面的考虑
String 变量不再引用后CLR会通过GC自动释放其内存
string s = abcd ;s = null;上面代码 我想当然的认为s = null 后已经不再对 abcd 这个字符串引用 如果没有其他引用指向这个字符串 GC会释放 abcd 这块内存 实际结果却是否定的 因为s 被赋予了一个常量 导致 abcd 这个字符串是驻留的 驻留的字符串在进程结束之前无法被自动释放 更糟糕的是 我昨天调试的那段程序里面大量的字符串变量被采用 string Intern 强制驻留 这导致我把所有的托管对象都释放了依然无法释放那部分大概 多M的内存
Performance Considerations
If you are trying to reduce the total amount of memory your application allocates keep in mind that interning a string has o unwanted side effects First the memory allocated for interned String objects is not likely be released until the mon language runtime (CLR) terminates The reason is that the CLR s reference to the interned String object can persist after your application or even your application domain terminates Second to intern a string you must first create the string The memory used by the String object must still be allocated even though the memory will eventually be garbage collected
The NET Framework version introduces the CompilationRelaxations :: NoStringInterning enumeration member The NoStringInterning member marks an assembly as not requiring string literal interning You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute Also when you use the Native Image Generator (Ngen exe) to pile an assembly in advance of run time strings are not interned across modules
看了英文的帮助就知道Intern 后的字符串是无法释放的了
两个String如果引用不同只能用Equal 比较
我一直想当然的认为 两个String 类型如果用 == 操作符比较 将比较其引用 所以如果两个String引用不同 则只能使用Equal 来比较它们是否相等
比如下面语句
string s = new StringBuilder() Append( My ) Append( Test ) ToString();string s = new StringBuilder() Append( My ) Append( Test ) ToString();如下方法比较其引用
Console WriteLine((object)s == (object)s );得到结果为 false 即s s 指向不同引用
那么我想当然的认为 Console WriteLine(s == s ); 的结果也是false 因为string 是引用类型 用==操作符比较引用类型变量 如果两个变量的引用不同 即便值相同 也会返回false 然而运行的结果让我大跌眼镜 返回的值是true
于是在网上狂搜 最后终于找到了原因
String 的等号操作符的处理是特殊的 其源码如下
=== Equality operator on string type (C#) ===
// The == operator overload MSIL: method public hidebysig specialname static bool op_Equality(string a string b) cil managed maxstack L_ : ldarg L_ : ldarg L_ : call bool System String::Equals( string string) L_ : ret
cha138/Article/program/net/201311/15387相关参考
能不能吃上放心菜,是百姓居家过日子每天都关心的一个问题。可是对什么蔬菜可以放心食用,消费者往往存在一些误区。误区一:地下根茎类蔬菜最放心一般来说,人们对从地里挖取出来的蔬菜比较放心,因为给蔬菜打药一般
来自医院第一线的信息表明,无论在发病率或死亡率方面,心脏病都已跃居于各类疾病之首位,成为名副其实的人类“头号杀手”,而人们对心脏病认识的若干误区又在相当程度上妨碍了对这种严重疾患的防治。误区一:瘦人不
农机在春耕生产中发挥着重要作用,如何保养农机具,减少维护保养错误,延长农机具的使用寿命是农机户常关注的问题,下面就农机维护保养中常见的几个错误加以介绍,以引起大家的注意,介绍不必要的损失。1、油底壳机
农机在春耕生产中发挥着重要作用,如何保养农机具,减少维护保养错误,延长农机具的使用寿命是农机户常关注的问题,下面就农机维护保养中常见的几个错误加以介绍,以引起大家的注意,介绍不必要的损失。1、油底壳机
浅谈痤疮认识的几个常见误区!痤疮是我们每个人都很熟悉的皮肤色斑问题。许多因为种种的脸部痤疮形象问题,而羞于出门,整日的泡在家里。更有一些人因为久治不愈的痤疮,严重的影响到生活工作。在此,请专家为您讲解
Java编程语言的几个认识误区 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138
春耕中农机维护保养常见的几个错误农机在春耕生产中发挥着重要作用,如何保养农机具,减少维护保养错误,延长农机具的使用寿命是农机户常关注的问题,下面就农机维护保养中常见的几个错误加以介绍,以引起大家的注意
春耕中农机维护保养常见的几个错误农机在春耕生产中发挥着重要作用,如何保养农机具,减少维护保养错误,延长农机具的使用寿命是农机户常关注的问题,下面就农机维护保养中常见的几个错误加以介绍,以引起大家的注意
正确使用String类应注意的几点! 以下文字资料是由(历史新知网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! javalangSt
知识大全 JAVA对象转为Java String的几种常用方法
JAVA对象转为JavaString的几种常用方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!