作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
一)
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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!