字符串实习和相等运算符

时间:2011-04-13 20:29:09

标签: .net string

我刚刚阅读此网站,其中说明: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 instancehttp://msdn.microsoft.com/en-us/library/362314fe.aspx)。

我没有检查String类的内部,但该声明是否正确?根据我的理解,String不可变的原因是由于字符串实习。换句话说,每个唯一值只存储一个字符串的副本。具有相同值的所有String变量引用相同的对象。我认为这就是为什么"a" == "a"有效 - 而不是因为defined to compare the values。如果它正在检查值,则必须逐个字符地比较字符串,从而导致显着的性能考虑,并消除使用字符串实习开始的主要原因之一。

也许他们过度简化了,但我认为建议String等式运算符的定义与其他引用类型不同,这是误导性的。如果我错了,请纠正我!

3 个答案:

答案 0 :(得分:4)

字符串可以实习,但不一定是这样。字符串文字是固定的(默认情况下 - 现在可以使用CompilationRelaxations.NoStringInterning属性进行更改),并且在运行时创建的实例可能是,但通常不会采取特殊步骤(如调用String.Intern() )。

可能有多个具有相同值的蜇伤实例。

此外,除了能够实习字符串以外,还有其他理由是不可变的 - 不变性主要是因为持有引用的对象不必担心那些在其背后改变的值。因此,更多的是能够互换字符串是不可变性的结果,而不是字符串必须是不可变的,所以我们可以实习它们。

答案 1 :(得分:2)

并非所有字符串都被实习;来自编译器的 literals / 常量(具体而言,ldstr IL代码)会自动实现,您可以手动实习/检查 - 但 < em>大多数 在运行时构造的字符串(例如来自用户输入,从文件/数据库加载,或与值连接)。所以是的:有必要进行价值检查。

实习只是一种优化;它需要在没有它的情况下工作。

答案 2 :(得分:2)

不,文档确切地说明了它们的意思:对于String s,==运算符逐字符地比较字符串的值。仅仅因为给定是引用类型并不意味着它必须通过引用进行比较;这就是为什么operator== can be overloaded

使用Reflector进行一些调查显示String的{​​{1}}调用operator==(String, String),它使用不安全的指针来比较基础值。