问题描述
|
我刚读了这个网站,上面写着:
Although string is a reference type,the equality operators (== and !=) are defined to compare the values of string objects,not references...a and b do not refer to the same string instance
(http://msdn.microsoft.com/en-us/library/362314fe.aspx)。
我还没有检查String
类的内部,但是那句话正确吗?据我了解,“ 1”不可变的原因是由于字符串嵌入。换句话说,每个唯一值仅存储一个字符串的副本。所有具有相同值的“ 1”变量均引用同一对象。我以为这就是\"a\" == \"a\"
起作用的原因-不是因为它是defined to compare the values
。如果要检查值,则必须逐个字符地比较字符串,从而导致性能方面的重大考虑,并消除了使用字符串实习开始的主要原因之一。
也许它们过分简化了,但我认为建议ѭ1相等运算符的定义与其他引用类型有所不同是一种误导。如果我错了,请纠正我!
解决方法
字符串可以被嵌入,但不一定必须如此。字符串文字会被保留(默认情况下-可以立即使用
CompilationRelaxations.NoStringInterning
属性进行更改),并且可以在运行时创建实例,但通常除非采取特殊步骤(例如调用String.Intern()
),否则不会这样做。
可能有多个具有相同值的st实例。
另外,除了能够内联字符串之外,还有其他原因,即它们是不可变的-不可变性主要是因为持有引用的对象不必担心那些值在“背后”的变化。因此,更重要的是,能够在字符串之间进行交互是不可变性的结果,而不是字符串必须是不可变的,这样我们才能进行内部实习。
,并不是所有的弦都被锁住了。来自编译器的文字/常量(尤其是ѭ9IL代码)会自动进行内插,并且您可以手动进行实习/检查-但大多数运行时构造的字符串(例如,从用户输入,从文件/数据库加载或与值)不是。所以是的:也必须进行价值检查。
实习只是一种优化;没有它就需要工作。
,不,文档确切说明了它们的意思:对于String
,==
运算符逐个字符地比较字符串的值。仅仅因为给定是引用类型,并不意味着它必须通过引用进行比较;这就是为什么operator==
可以超载的原因。
通过对Reflector的一点戳可以发现String
\'soperator==(String,String)
调用Equals(String,String)
,它使用不安全的指针比较基础值。