Почему Assert.AreSame () считает две отдельные строки одинаковыми? - PullRequest
2 голосов
/ 02 февраля 2020

Почему этот проход Assert.AreSame()?

[TestMethod]
public void StringSameTest()
{
      string a = "Hello";
      string b = "Hello";

      Assert.AreSame(a, b);
}

Я понимаю, что «тестирует на равенство ссылок и по сути то же самое, что и Assert.IsTrue(object.ReferenceEquals(a, b)), но ясно, что a и b - это разные строковые объекты, независимо от того, имеют ли они одинаковые значения. Если Ì установить string b = a;, я ожидаю истины, но это не так. Почему этот тест не проходит?

Спасибо

1 Ответ

5 голосов
/ 02 февраля 2020

C# компилятор будет intern идентичных буквенных строк для той же ссылки на константную строку.

Таким образом, ваш код эквивалентен этому:

private const String _hello = "Hello";

[TestMethod]
public void StringSameTest()
{
      string a = _hello;
      string b = _hello;

      Assert.AreSame( a, b ); // true
}

Чтобы создать отдельный экземпляр строки, идентичный константной строке, используйте String.Copy():

string a = "Hello";
string b = a.Copy();

Assert.AreSame( a, b ); // false

Однако обратите внимание:

  • String.Copy() и String.Clone() разные!
    • Clone() фактически не клонирует строковое значение, вместо этого он возвращает ссылку на себя.
    • String.ToString() также возвращает ссылку на себя.
  • String.Copy() устарела в. NET Framework и. NET Core и может быть удалена в будущей версии.

См. Оптимизируются ли строковые литералы компилятор?

...