两个相同的字符串可以比较不同的实例吗?

时间:2015-05-23 18:02:53

标签: .net string equality string-interning st

C#编程语言的第7.10.7节(A. Hejlsberg等,2011第四版,注释为4.0)指出,"当两个单独的字符串实例包含完全相同的字符序列时,字符串的值相等,但引用不同。"

这是否是运行时间的情况?赢得了.NET运行时和BCL总是将两个相同的字符串实习到同一个参考盒?

我知道这本书正在谈论一个'规范,但下一个问题 - 是否有任何已知的C#实现方式?

修改

好吧,真正困扰我的是:

String FirstOne = "StatusOK"
String MiddleOne = "StatusOK"
String LastOne = "StatusOK"

Integer FindMeOne(object AnythingtoFind) { return MsgLst.IndexOf(AnythingToFind) }

List<String> MsgLst;
MsgLst.Add(FirstOne);
MsgLst.Add(MiddleOne);
Msglst.Add(LastOne);

Integer foo = FindMeOne( LastOne );

我不希望foo成为1! 我想我这么傻。

UPDATE     我需要做的就是得到我想要的东西:

public class MyNiceStringsThatICanFind 
{ 
private String foobar;
}

但这又不错。如果对象通过HashCode跟踪自己,那么字符串特别臭的是什么?为什么运行时没有查看你的对象,看看,嘿,也许它是完全相同的东西,让我们做同样的参考。

1 个答案:

答案 0 :(得分:1)

此等式行为仅适用于字符串文字(尽管请参阅NoStringInterning)。如果在运行时创建相等的字符串,则它们不一定会引用相同的实例:

var abc = "abc";
var ab = "ab";
var c = "c";

var abc2 = ab + c;
bool eq = Object.ReferenceEquals(abc, abc2);  //false

var interned = String.Intern(abc2);
bool ieq = Object.ReferenceEquals(interned, abc);  //true