两个具有相同值的字符串如何存储在内存中?

Ven*_*war 4 c#

string first="Example";
string second="Example";
Run Code Online (Sandbox Code Playgroud)

两个字符串具有相同的哈希码并且两个引用相同。

我的问题是:这些字符串变量在内存位置中是否有单个数据副本?

string third="Example";
static string fourth="Example";
const string fifth="Example";
Run Code Online (Sandbox Code Playgroud)

以上两套有区别吗?

Mar*_*ell 5

在这个特定示例中,所有字符串都是对单个对象具有相同值的不同引用string。这是因为ldstrIL 指令实习文字字符串并重用它们而不是分配 per ldstr

你可以用ReferenceEquals(first, second)等检查这个。

请注意,这个const稍微更有趣,因为它然后ldstr 在 call-site变成文字,并且如何共享实习可能取决于程序集边界。

但是:并不是所有的都 "Example"必须是相同的参考。大多数其他获取字符串的机制(通过处理输入数据)不会查看内部数据,而只会构造一个新字符串。