我知道字符串驻留是什么,以及为什么以下代码的行为是这样的:
编译器如何“知道”
var hello = "Hello";
var he_llo = "He" + "llo";
var b = ReferenceEquals(hello, he_llo); //true
或者
var hello = "Hello";
var h_e_l_l_o = new string(new char[] { 'H', 'e', 'l', 'l', 'o' });
var b = ReferenceEquals(hello, he_llo); //false
我以为我知道怎么做,因为在我正在处理的某些代码中出现了一个微妙的错误,原因是这个:
var s = "";
var sss = new string(new char[] { });
var b = ReferenceEquals(s, sss); //True!?
编译器如何“知道”
sss
实际上将是一个空字符串?
char[]
的string
构造函数具有特殊逻辑,如果传递一个空数组,它将简单地指向一个真正的空字符串,而不是实际构造一个新对象。在SO上有一个问题(标题很糟糕)解释了这一点。明确一点,这是一个运行时问题--令人惊讶的不是编译器有先见之明,而是new
并不总是new
。 - Jeroen Mosterts
(使得s.Length == 0
),而Object.ReferenceEquals(s, "")
不成立?如果有的话,我还没有找到 -- 通过操作一个最初非空的字符串来创建一个空字符串似乎行不通,无论你多聪明。 - Jeroen Mostert