C#String / string:比较Java中的字符串(参考)

时间:2017-07-25 03:27:00

标签: java c# string reference

如何像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的情况下实现相同的效果?

3 个答案:

答案 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