Как работает оператор == для строк?

System.String перегружает операторы == и !=, но оба они вызывают метод Equals. Первая часть этого метода понятна, сравниваются ссылки/длина/на null. Но вторая часть для меня остаётся непонятной. Вызывается метод SpanHelper.SequenceEquals. Что он делает? Туда передается только первый char сравниваемых строк, кастуется к byte, а дальше ничего не понятно.


Ответы (1 шт):

Автор решения: S.H.

Прошу прощения, если я объясняю очевидную вещь,

но, по моему, там довольно понятный алгоритм:

после сравнения ("что если оба null - о! надо вернуть true!")

происходит сравнение длинн строк. Длинны не равны? - возвращаем false!

И у нас остался один вариант, когда длинны двух строк равны.

Тогда вызывается оптимизированная версия сравнения последовательностей - этот самый SequenceCompareTo()

Первый байты передаются вот почему: так как там всё помечено Unsafe, то взяв первый байт и зная длинну, можно бежать по последовательности байтов, делая инкремент индекса (и из за ансейва не боясь стукнуться о границу последовательности и получить exception)

Как то так.

Конечно, такие хитрые преобразования типов мне и в страшном сне бы не приснились, но выглядит всё довольно логично.

я немного удивлён другим - именно побайтовым сравнением, без перехода на команды процессора, работающие с 64-битными словами...

→ Ссылка