当前位置: 首页 > 编程语言 > C#

InternString字面量误区?分享

时间:2023-04-10 10:38:25 C#

intern字符串字面量误解?我不明白:MSDN说http://msdn.microsoft.com/en-us/library/system.string.intern.aspx所以具有特定值的文字字符串实例在系统中只存在一次。例如,如果将相同的文字字符串分配给多个变量,运行时将从内部池中检索对文字字符串的相同引用并将其分配给每个变量。这种行为是默认的(没有实习生)吗?还是使用Intern方法?1)我会在内存中出现1000次“lalala”吗?(不使用实习生......)2)“lalala”最终会被Gc'ed吗?3)“啦啦啦”被拘留了吗?如果是这样,为什么我需要从池中“获取”它而不是再次写“lalala”?我有点困惑。字符串文字是自动实现的(因此如果您的代码包含“lalala”1000次,则只会存在一个实例)。这样的字符串不会得到GC,只要它们被引用,引用就是禁用的字符串。string.Intern适用于不是文字的字符串-例如来自用户输入或从文件或数据库中读取,并且您知道这些字符串会经常重复,因此值得在过程的整个生命周期内进行实习。实习是幕后发生的事情,所以作为程序员的你永远不必担心。您通常不需要向池中放入任何东西,也不必从池中获取任何东西。就像垃圾回收一样:您永远不必调用它,也不必担心它可能会发生,或者担心它可能不会发生。(好吧,在99.999%的情况下。剩下的0.001%是当你做了一些非常奇怪的事情时。)编译器负责实现源文件中包含的所有字符串文字,所以“lalala”将在你不采取任何行动或对此事有任何控制权。每当您在程序中引用“lalala”时,编译器将确保从实习生池中获取它,同样无需您做任何事情或对此事有任何控制。实习生池包含或多或少固定数量的字符串,通常非常小(仅占.exe总大小的一小部分),因此它们永远不会被垃圾收集并不重要。EDIT字符串的实现大大提高了某些字符串操作(如Equals())的执行时间。String的Equals()方法首先检查字符串是否相等,速度很快;如果引用相等,则立即返回true;如果引用不相等,并且字符串都满足,它会立即返回false,因为它们不可能相等,因为实习生池中的所有字符串都彼此不同。如果以上都不成立,则通过字符串比较进行字符处理。(实际上,它甚至比这更复杂,因为它还检查字符串的哈希码,但在本次讨论中让我们保持简单。)因此,假设您正在从strings的文件中读取标记,并且您有一个switch语句形式:switch(s){case"cat":....case"dog":....case"tod":....}stringliteral"cat","dog","tod"是所有实习生,但你将他们每个人都与s进行比较,而s没有实习生,所以你没有从实习生池中受益。如果您在switch语句之前实习,则switch语句完成的比较会快得多。当然,如果您的文件可能包含垃圾,则您不想这样做,因为将大量随机字符串加载到实习生池中肯定会降低程序的性能并最??终耗尽内存。C#学习教程到此为止:实习生字符串字面量误区?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: