Re: EqualityComparer<T>.Default
От: Qbit86 Кипр
Дата: 22.06.21 22:09
Оценка: 38 (1) +3
Здравствуйте, Kolesiki, Вы писали:

K>Тема для многих не новая, но её тупость не теряет актуальности.


Тупость не теряет актуальности, но вот Майкрософта ли?..

K>Речь идёт об "интернировании строк"


Интернирование тут ни при чём. При чём дефолтный компаратор. Если ты не передаёшь компаратор в явном виде, то подписываешься на то, что его выберут за тебя.

K>В какой идиотской стране два одинаково выглядящих дома имеют ОДИН АДРЕС?

K>А чем строки отличаются от домов? Да ничем! Выглядеть одинаково != быть одним и тем же.

Вот тебе два разных одинаково выглядящих дома, имеющих разный адрес:
string s1 = "STRoka".ToLowerInvariant();
string s2 = "strOKA".ToLowerInvariant();
bool isInterned = string.IsInterned(s1) is not null;
Console.WriteLine($"{nameof(isInterned)}: {isInterned}"); // False
bool areReferenceEqual = ReferenceEquals(s1, s2);
Console.WriteLine($"{nameof(areReferenceEqual)}: {areReferenceEqual}"); // False
bool areSemanticallyEqual = string.Equals(s1, s2, StringComparison.Ordinal);
Console.WriteLine($"{nameof(areSemanticallyEqual)}: {areSemanticallyEqual}"); // True
List<string> list = new() { s1, s2 };
Console.WriteLine($"{nameof(list.IndexOf)}({nameof(s2)}): {list.IndexOf(s2)}"); // 0


K>Неужели им самим не прилетало от подобных оптимизаций?




K>По-уму, надо было оставить сравнение строк (s1 == s2) ровно таким же, как для объектов — через сравнение ссылок.


Обобщённые алгоритмы стандартной библиотеки не используют operator ==. Они используют либо переданный компаратор, либо дефолтный, который в свою очередь резолвит сравнение через переопределённый метод Equals, или фоллбэчатся к сравнению ссылок.
Глаза у меня добрые, но рубашка — смирительная!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.