Зачем избегать string.ToLower() при сравнении строк без учета регистра?
Я читал, что, когда в вашем приложении вы много сравниваете строки и используете метод ToLower, этот метод довольно дорогой. Мне было интересно, кто-нибудь может объяснить мне, как это дорого. Буду признателен за любую информацию или объяснения. Спасибо!
4 ответа
Это дорого, потому что новая строка "изготовлена".
Сравните это с вызовом, скажем, Equals с перегрузкой, которая требует сравнения без учета регистра. Это позволяет завершить сравнение без необходимости создания новой строки, как только будет выявлено несоответствие.
См. Также написание управляемого с точки зрения культуры кода по очень веской причине, почему бы не использовать ToLower()
,
В частности, смотрите раздел о турецком "я" - это не вызывало бесконечных проблем в прошлом, где я работаю...
призвание "I".ToLower()
не вернется "i"
если нынешняя культура турецкая или азербайджанская. Прямое сравнение по этому вопросу вызовет проблемы.
Есть еще одно преимущество использования метода String.Compare(String, String, StringComparison), помимо тех, которые упомянуты в других ответах:
Вы можете пройти null
значения и по-прежнему получить относительное значение сравнения. Это намного облегчает написание ваших сравнений строк.
String.Compare(null, "some StrinG", StringComparison.InvariantCultureIgnoreCase);
Из документации:
Один или оба сравнения могут быть нулевыми. По определению любая строка, включая пустую строку (""), сравнивается больше, чем нулевая ссылка; и две нулевые ссылки сравниваются равными друг другу.
Каждый раз, когда вы вызываете ToLower(), будет создаваться новая копия строки (в отличие от внесения изменений в регистр на месте). Это может быть дорогостоящим, если у вас много строк или длинных строк.
Из документов String.ToLower:
Возвращает копию этой строки, преобразованную в нижний регистр.
Как кто-то уже ответил, ToLower() создаст новый строковый объект, который является дополнительной стоимостью по сравнению с использованием "IgonoreCase". Если этот ToLower часто запускается, вы в конечном итоге создаете много мелких объектов в своей куче и добавляете время сбора мусора, что снижает производительность.