如何像Java一样通过引用比较字符串?我知道C#的字符串按值与==
进行比较。
Object.ReferenceEquals
也不能很好地工作,因为如果字符串的内容已存在于实习池中,C#会将字符串的现有地址分配给新字符串。
我已阅读此帖,他们建议:
Comparing VALUE and REFERENCE of types
string str = "hello";
string str2 = new StringBuilder().Append("he").Append("llo").ToString();
我想要发生的事情是这样的:
string s1 = "a";
string s2 = "a";
Console.WriteLine(s1 == s2); //False
//Or
Console.WriteLine(Object.ReferenceEquals(s1,s2)); //False
然而,上述2个字符串不是这种情况。如何在不使用StringBuilder
的情况下实现相同的效果?
答案 0 :(得分:1)
您可以使用String.Copy
创建新实例:
string s1 = "a";
string s2 = String.Copy(s1);
Console.WriteLine(Object.ReferenceEquals(s1,s2)); //False
答案 1 :(得分:0)
您可以简单地使用new
:
char[] charArray = new char[3];
charArray[0] = 'a';
charArray[1] = 'b';
charArray[2] = 'c';
string s1 = new string(charArray);
string s2 = new string(charArray);
Console.WriteLine(Object.ReferenceEquals(s1, s2));
可运行的示例:https://ideone.com/H1O16q
这样做的原因是因为new
总是在不进行任何内化的情况下创建给定类型的新实例。据我所知,每种主要的OOP语言都是这样的。
答案 2 :(得分:-2)
在C#中,string是不可变引用类型。因此,它具有与值类型相似的行为(例如:此处为您的示例)。但字符串构建器纯粹是引用类型。
因此,您不能使用字符串来比较引用,但您可以使用stringbuilder。
StringBuilder p = new StringBuilder("test");
StringBuilder q = new StringBuilder("test");
Console.WriteLine(p == q); //false