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跟踪自己,那么字符串特别臭的是什么?为什么运行时没有查看你的对象,看看,嘿,也许它是完全相同的东西,让我们做同样的参考。
答案 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