【问题标题】:String reference check return true in my unit Test字符串引用检查在我的单元测试中返回 true
【发布时间】:2017-12-17 17:15:45
【问题描述】:

下面是我的测试用例。两个字符串都是不同的对象,但我的测试用例通过了。

我预计他们会失败。因为它们是不同的对象。

 string string1 = "Hello World";
    string string4 = "Hello World";
    Assert.AreSame(string1, string4);//Will return true
    Assert.IsTrue(object.ReferenceEquals(string1,string4));

【问题讨论】:

标签: c#


【解决方案1】:

编译器将为相等的硬编码字符串创建一个“对象”。

但是如果你动态创建字符串

var string1 = "Hello World";
var name = "World";
var string2 = "Hello " + name;
Assert.AreSame(string1, string2); //Will return false
Assert.IsTrue(object.ReferenceEquals(string1,string2)); // Fail
Assert.AreEqual(string1, string2); // Pass

String.Intern Method (String)

公共语言运行时通过维护一个 表,称为实习生池,其中包含对 以编程方式声明或创建的每个唯一文字字符串 你的程序。因此,文本字符串的实例具有 特定值在系统中只存在一次。

【讨论】:

    【解决方案2】:

    比较字符串时。如果 objA 和 objB 是字符串,则 ReferenceEquals 方法在字符串被保留时返回 true。它不执行值相等性测试。

    在以下示例中,s1 和 s2 相等,因为它们是单个内部字符串的两个实例。 但是,s3 和 s4 是不相等的,因为尽管它们具有相同的字符串值,但该字符串没有被保留。

    String s1 = "String1";
    String s2 = "String1";
    //string is interned
    
    String suffix = "A";
    String s3 = "String" + suffix;
    String s4 = "String" + suffix;  
    //string is not interned
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2018-07-13
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多