字符串迭代和相等运算符

问题描述

| 我刚读了这个网站,上面写着:
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
\'s
operator==(String,String)
调用
Equals(String,String)
,它使用不安全的指针比较基础值。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...