1

C# Programming Language (A. Hejlsberg, et. al, 2011 Fourth Edition, Annotated for 4.0) 第 7.10.7 节指出,“当两个单独的字符串实例包含完全相同的字符序列时,字符串的值相等,但参考不同。”

这曾经是运行时案例吗?.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!我想我就是这么傻。

更新我所要做的就是得到我想要的:

public class MyNiceStringsThatICanFind 
{ 
private String foobar;
}

但这又不好。如果对象通过 HashCode 跟踪自己,那么字符串有什么特别之处呢?为什么运行时不看你的 Objects 看看,嘿,也许它里面的东西完全一样,让我们​​让它成为相同的引用。

4

1 回答 1

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
于 2015-05-23T18:16:10.610 回答