关于 String 的哪些常见错误理解是错误的?
- 内容介绍
- 相关推荐
本文共计1748个文字,预计阅读时间需要7分钟。
对String的几个错误认识+昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String的错误使用造成,这促使我今天又深入研究了一下String类型。
对 String 的几个错误认识
昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String 的错误使用造成,这促使我今天又仔细研究了一下String类型,不研究不知道,一研究发现我过去对String 的很多认识都是错误的,感觉这种错误认识还比较有典型性,于是写下此文和大家一起探讨。
1. String 类型变量追加,或修改后的新String对象是驻留(Interned)的。
如下面代码
strings2=s1+"e";
我过去想当然的认为s2 是驻留的,但实际上并非如此,用 string.IsInterned 方法检测s2是非驻留的。后来研究发现只有常量字符串才会默认驻留,其他的字符串变量哪怕是采用 new string 构造出来的,默认都非驻留,除非用string.Intern 强行驻留。后面我将提到驻留对内存的影响,微软之所以不让所有的字符串都驻留,我认为还是处于内存方面的考虑。
2. String 变量不再引用后CLR会通过GC自动释放其内存。
本文共计1748个文字,预计阅读时间需要7分钟。
对String的几个错误认识+昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String的错误使用造成,这促使我今天又深入研究了一下String类型。
对 String 的几个错误认识
昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String 的错误使用造成,这促使我今天又仔细研究了一下String类型,不研究不知道,一研究发现我过去对String 的很多认识都是错误的,感觉这种错误认识还比较有典型性,于是写下此文和大家一起探讨。
1. String 类型变量追加,或修改后的新String对象是驻留(Interned)的。
如下面代码
strings2=s1+"e";
我过去想当然的认为s2 是驻留的,但实际上并非如此,用 string.IsInterned 方法检测s2是非驻留的。后来研究发现只有常量字符串才会默认驻留,其他的字符串变量哪怕是采用 new string 构造出来的,默认都非驻留,除非用string.Intern 强行驻留。后面我将提到驻留对内存的影响,微软之所以不让所有的字符串都驻留,我认为还是处于内存方面的考虑。
2. String 变量不再引用后CLR会通过GC自动释放其内存。

