加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – string和StringBuilder有什么区别?

发布时间:2020-12-15 18:12:23 所属栏目:百科 来源:网络整理
导读:我知道字符串是不可变的,StringBuilder是可变的.但任何人都可以解释下面的代码输出吗?由于两者都是参考类型,为什么它们会有不同的结果呢? String s1 = "hello";String s2 = "hello";Console.WriteLine(s1 == s2); //trueConsole.WriteLine(Object.Referenc
我知道字符串是不可变的,StringBuilder是可变的.但任何人都可以解释下面的代码输出吗?由于两者都是参考类型,为什么它们会有不同的结果呢?
String s1 = "hello";
String s2 = "hello";
Console.WriteLine(s1 == s2); //true
Console.WriteLine(Object.ReferenceEquals(s1,s2)); //true

StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = new StringBuilder("hello");
Console.WriteLine(sb1 == sb2); //false
Console.WriteLine(Object.ReferenceEquals(sb1,sb2)); //false

解决方法

Since both are reference types,why do they have different results?

因为字符串对象是高度优化的.特别是,由于它们是不可变的,因此可以由编译器实现它们以防止重复.

如果您有两个不同的字符串对象,它们都表示完全相同的字符串(如您的示例中所示),则编译器将识别该对象并仅维护实际字符串对象的一个??实例.

结果是,就编译器而言,s1和s2对象实际上是同一个对象,甚至引用内存中的相同位置.

这种簿记发生在一个叫做“实习生表”的幕后,但这并不是你需要担心的事情.重要的是所有字符串文字都是由编译器默认实现的.

StringBuilder对象不会发生同样的事情,因为它们不是不可变的.它们旨在允许您修改字符串对象,因此,优化没有多大意义.这就是为什么你的sb1和sb2对象实际上被视为两个不同的对象.

经验法则很简单:默认情况下使用字符串,或者当您需要单个不可变字符串时.如果要多次修改相同的字符串,请使用StringBuilder,例如在循环或其他相对较短的代码段中.

相关阅读:Optimizing C# String Performance

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读