在 C# 中,字符串是驻留的。也就是说,如果我创建字符串foobar
当第二次使用它时,C# 在内存中只会有一个字符串实例,虽然我有两个引用,但它们都将指向同一个字符串实例。这就是 C# 中字符串必须不可变的原因之一。
现在,我的问题是,是否有可能以某种方式创建两个相同的字符串,以便它们不会被保留,但我们最终会在内存中得到两个不同的字符串实例,具有两个不同的地址,并且包含完全相同的文本?
如果是这样,怎么办?
而且,这种情况是否会意外发生,或者您是否需要为这种情况明确构建一个场景?
最后:假设内存中有两个具有相同值的独立字符串实例,它们是否相等(就==
)?如果是这样,如何==
工作?首先通过引用进行比较,然后通过值进行比较,或者……?
在 C# 中,字符串是驻留的。
否。在 C# 字符串中被允许被拘留。这是一个非常不同的说法。
也就是说,如果我创建字符串 foobar 并第二次使用它,C# 在内存中将只有该字符串的一个实例,尽管我将有两个引用,但它们都将指向同一个字符串实例
不。同样,在 C# 中,运行时是允许的确定一个“foobar”与另一个“foobar”相同并实习它们,但事实并非如此required这样做。
当然,如果您复制引用,那么该引用也会被复制。但是,如果您创建的第二个字符串与之前的字符串看起来相同,则不需要将其保留。
实际上,当字符串是文字时,它们会被保留:
string x = "foobar";
string y = "foobar";
// x is reference equal to y
或者当编译器可以计算出它们相同时:
string x = "foobar";
string y = "foo" + "bar";
// x is reference equal to y
或者当您明确告诉运行时您想要保留特定字符串时。否则,字符串通常不会被保留:
string x = "foobar";
string y = "f" + x.Substring(1);
// x and y are not reference equal
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)