C#编译器或.NET CLR是否对字符串文字/常量进行了任何巧妙的内存优化?我可以发誓我听说过"字符串内化"的概念,所以在程序的任何两位代码中,字面意思"这是一个字符串"实际上是指同一个对象(大概是安全的,字符串是什么一成不变的?).我在谷歌上找不到任何有用的参考资料......
我听错了吗?别担心 - 我的代码中没有用这些信息做任何可怕的事情,只是想更好地了解它的工作原理.
我有以下代码:
object val1 = 1;
object val2 = 1;
bool result1 = (val1 == val2);//Equals false
bool result2 = val1.Equals(val2); //Equals true
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?修复此问题的唯一方法是使用.Equals()方法吗?
object a = "1";
object b = "1";
Console.WriteLine(a == b); // returns True
object c = 1;
object d = 1;
Console.WriteLine(c == d); // returns False
Run Code Online (Sandbox Code Playgroud)
上面的代码返回整数和字符串的不同结果.我无法理解为什么.有人可以帮我理解这背后的原因吗?
==(运营商)和ReferenceEquals(功能)有什么区别?
公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对在程序中以编程方式声明或创建的每个唯一文字字符串的单个引用.因此,具有特定值的文字字符串实例仅在系统中存在一次.
例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量.
Intern方法使用实习池来搜索等于str值的字符串.如果存在此类字符串,则返回其在实习池中的引用.如果该字符串不存在,则将对str的引用添加到实习池中,然后返回该引用.....如果您正在尝试减少应用程序分配的内存总量,请记住,实习字符串有两个不需要的副作用.首先,在公共语言运行时(CLR)终止之前,不太可能释放为被占用的String对象分配的内存.
那么,这是否意味着CLR为所有正在运行的.net应用程序保留一个单一的实习池?示例:如果程序A创建字符串文字"Test",并且如果另一个程序尝试创建另一个字符串文字"Test",则使用相同的副本?同样的问题也适用于JVM.