Roy*_*mir 5 .net c# string-interning
我不明白:
MSDN说
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
因此,具有特定值的文字字符串实例仅在系统中存在一次.
例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量.
这种行为是默认的(没有实习生)吗?或者使用Intern方法?
如果是默认值,为什么我要使用实习生?(实例将一次......)?
如果它是NOT默认值:如果我写了1000次这一行:
Console.WriteLine( "LALALA");
1)我会在记忆中得到1000次"lalala"吗?(不使用实习生...)
2)将"lalala"最终Gc'ed?
3)"lalala"是否已被实习?如果确实如此,为什么我需要从池中"获取"它,而不是再次写"lalala"?
我有点困惑.
字符串文字自动实现(因此,如果您的代码包含1000次"lalala",则只存在一个实例).
这样的字符串不会得到GC,并且只要它们被引用,引用就是被禁用的字符串.
string.Intern是否存在不是文字的字符串- 例如来自用户输入或从文件或数据库中读取,并且您知道将经常重复,因此值得在过程的生命周期中实习.
实习是在幕后发生的事情,因此作为程序员你永远不必担心它.您通常不需要向池中放置任何东西,也不必从池中获取任何内容.就像垃圾收集一样:你永远不必调用它,或担心它可能会发生,或担心它可能不会发生.(好吧,在99.999%的案例中.剩下的0.001%就是你做的很奇怪的事情.)
编译器负责实现源文件中包含的所有字符串文字,因此"lalala"将被实习,无需您执行任何操作或对此事项拥有任何控制权.每当你在你的程序中引用"lalala"时,编译器都会确保从实习池中获取它,同样不需要你做任何事情,也无法控制这个问题.
实习池包含一个或多或少固定数量的字符串,通常是非常小的字符串(只是.exe的总大小的一小部分),所以它们永远不会被垃圾收集并不重要.
编辑
实现字符串的目的是大大改善某些字符串操作(如Equals())的执行时间.所述Equals()的方法String首先检查字符串是否由参考,这是非常快相等; 如果引用相等,则true立即返回; 如果引用不相等,并且字符串都被中断,则它false立即返回,因为它们不可能相等,因为实习池中的所有字符串彼此不同.如果以上都不成立,则通过字符串比较继续进行字符.(实际上,它比这更复杂,因为它还会检查字符串的哈希码,但在本讨论中让我们保持简单.)
因此,假设您正在使用字符串中的文件读取标记s,并且您具有以下形式的switch语句:
switch( s )
{
case "cat": ....
case "dog": ....
case "tod": ....
}
Run Code Online (Sandbox Code Playgroud)
字符串文字"猫","狗","TOD"都被扣留,但你是比较每其中之一对s,还没有被拘留,这样你就不会收获实习生池的好处.如果你s在switch语句之前实习,那么switch语句将要进行的比较将会快得多.
当然,如果你的文件可能包含垃圾的任何可能性,那么你不想这样做,因为加载大量的随机字符串到实习生池是一定要杀死你的程序的性能,并最终耗尽内存.
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |