c# - 由于字符串是不可变的,具有相同字符串值的变量是否指向同一个字符串对象?

标签 c# .net string

一)

        string s  = "value";
        string s1 = "value";

s 和 s1 引用变量是否指向同一个字符串对象(我假设这是因为字符串是不可变的)?

b) 我意识到相等运算符(==、> 等)已被重新定义以比较字符串对象的值,但在使用静态方法 Object.Equals() 和 Object.ReferenceEquals() 比较两个字符串时也是如此?

谢谢

最佳答案

不,并非所有具有相同值的字符串都是相同的对象引用。

编译器生成的字符串都将是 Interned 并且是相同的引用。运行时生成的字符串在默认情况下不会被保留,并且会是不同的引用。

var s1 = "abc";
var s2 = "abc";
var s3 = String.Join("", new[] {"a", "b", "c"});
var s4 = string.Intern(s3); 
Console.WriteLine(ReferenceEquals(s1, s2)); // Returns True
Console.WriteLine(ReferenceEquals(s1, s3)); // Returns False
Console.WriteLine(s1 == s3); // Returns True
Console.WriteLine(ReferenceEquals(s1, s4)); // Returns True

请注意上面的行,您可以使用 String.Intern(string) 强制驻留字符串,然后允许您使用对象相等性而不是字符串相等性进行某些检查,这要快得多.一个非常常用的示例是在生成的 XML 序列化程序代码和名称表中。

关于c# - 由于字符串是不可变的,具有相同字符串值的变量是否指向同一个字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231840/

相关文章:

.net - $ExecutionContext.InvokeCommand.GetCommand() 和 Get-Command 有什么区别?

c# - 解析空格分隔文本的最佳方法

c# - 在更新面板中调用时,Javascript 确认框不显示

c# - 我怎样才能得到 double 的符号位?

c# - 在我的 .net MVC View 中使用 @Html.React

c# - Rx DelayOnTrue 扩展实现

.Net - 使用 HttpClient 发布文件?

.net - Ajax 未与 Rotativa ViewAsPdf 一起运行

java - 字符串数组在android中只返回一个字符串

android - 高效访问配置文件中的多个字符串之一