Как работает оператор == для строк?
System.String перегружает операторы == и !=, но оба они вызывают метод Equals. Первая часть этого метода понятна, сравниваются ссылки/длина/на null. Но вторая часть для меня остаётся непонятной. Вызывается метод SpanHelper.SequenceEquals. Что он делает? Туда передается только первый char сравниваемых строк, кастуется к byte, а дальше ничего не понятно.
Ответы (1 шт):
Прошу прощения, если я объясняю очевидную вещь,
но, по моему, там довольно понятный алгоритм:
после сравнения ("что если оба null - о! надо вернуть true!")
происходит сравнение длинн строк. Длинны не равны? - возвращаем false!
И у нас остался один вариант, когда длинны двух строк равны.
Тогда вызывается оптимизированная версия сравнения последовательностей - этот самый SequenceCompareTo()
Первый байты передаются вот почему: так как там всё помечено Unsafe, то взяв первый байт и зная длинну, можно бежать по последовательности байтов, делая инкремент индекса (и из за ансейва не боясь стукнуться о границу последовательности и получить exception)
Как то так.
Конечно, такие хитрые преобразования типов мне и в страшном сне бы не приснились, но выглядит всё довольно логично.
я немного удивлён другим - именно побайтовым сравнением, без перехода на команды процессора, работающие с 64-битными словами...