有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

C#String/String:比较Java中的类似字符串(通过引用)

如何像Java中那样通过引用比较字符串?我知道C#的字符串是通过值与==进行比较的

Object.ReferenceEquals也不能很好地工作,因为C#将字符串的现有地址分配给新字符串(如果其内容已经存在于intern池中)

我读过这篇文章,他们建议:

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

但是上述两个字符串的情况并非如此。如何在不使用StringBuilder的情况下实现相同的效果


共 (3) 个答案

  1. # 1 楼答案

    在C#中,字符串是不可变的引用类型。因此,它的行为与值类型类似(例如:这里的示例)。但是字符串生成器纯粹是引用类型

    所以,不能使用字符串来比较引用,但可以使用stringbuilder

    StringBuilder p = new StringBuilder("test");
            StringBuilder q = new StringBuilder("test");
    
            Console.WriteLine(p == q); //false
    
  2. # 2 楼答案

    你可以简单地使用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语言都是这样运行的

  3. # 3 楼答案

    可以使用^{}创建新实例:

    string s1 = "a";
    string s2 = String.Copy(s1);
    Console.WriteLine(Object.ReferenceEquals(s1,s2)); //False