Как происходит сравнение строк в dotnet? - PullRequest
0 голосов
/ 04 февраля 2011

Я скажу

var str1 = "Name1"; 
var str2 = "Name1";

, если я сделаю str1 == str2, результат будет верным (как и ожидалось).

Но мой вопрос заключается в том, как происходит сравнение ...символ за характером или как?

Тогда как string.Intern помогает улучшить производительность?

Ответы [ 5 ]

7 голосов
/ 04 февраля 2011

Для строк == сравнивает значения строк ( смотри это ).Однако в этом случае ссылки будут одинаковыми из-за интернирования строк, так как все литеральные строки интернированы по умолчанию.Если вы посмотрите на реализацию для ==, то увидите, что она вызывает string.Equals, которая сначала выполняет сравнение ссылок.

1 голос
/ 04 февраля 2011

Когда вы делаете

string x = "hello";
string y  = "world";
bool result = x == y;

, вы вызываете String :: op_Equality, который в свою очередь вызывает метод static String.Equals, который выглядит так:*

Метод EqualsHelper сравнивает символ за символом.

Это означает, что он сначала проверяет, равны ли ссылки.

1 голос
/ 04 февраля 2011

Равенство строк сначала проверяет, являются ли сравниваемые строки одним и тем же объектом.В этом случае из-за интернирования строк, которое будет истинным, сравнение будет возвращаться вместо любого вида сравнения символов.

Интернированием строк можно манипулировать в коде, но чаще это выполняется как частьсборник.Все строковые литералы скомпилированы в таблицу, а ссылки на строковые литералы заменены ссылками на записи в этих таблицах.Это помогает объединять строки и может уменьшить объем памяти.Побочным эффектом является то, что строковые литералы с одинаковым значением теперь будут иметь одинаковую ссылку, поэтому сравнение будет чрезвычайно эффективным.

Хотя процесс интернирования наиболее известен как часть компиляции, строки могут интернироваться программно.*

0 голосов
/ 04 февраля 2011

Во-первых, если строки ссылаются на один и тот же объект (как в вашем примере), тогда сравнение может немедленно вернуть true.Во-вторых, если строки не имеют одинаковую длину, сравнение может немедленно вернуть false.После этого это действительно посимвольное сравнение.

Это основано на выводе из Reflector, глядя на .NET 4.0.

0 голосов
/ 04 февраля 2011

Сначала он проверяет, чтобы ссылка на объект была такой же (резон объясняется другими ответами), если нет, то он сравнивает символ с символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...