gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:51:46 25 4
gpt4 key购买 nike

我知道 string 是不可变的而 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?

因为 string 对象是高度优化的。特别是,由于它们是不可变的,它们可以被编译器保留以防止重复。

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

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

这种簿记发生在称为“实习生表”的幕后,但这并不是您真正需要担心的事情。重要的是编译器默认保留所有字符串文字。

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

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

相关阅读:Optimizing C# String Performance

关于c# - string 和 StringBuilder 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com