Нормализация строк с помощью String.ToUpperInvariant () - PullRequest
10 голосов
/ 21 апреля 2009

В настоящее время я храню нормализованные версии строк в моей базе данных SQL Server в нижнем регистре. Например, в моей таблице Users у меня есть поля UserName и LoweredUserName. В зависимости от контекста, я использую функцию LOWER () в T-SQL или метод String.ToLower () в C # для генерации строчной версии имени пользователя для заполнения поля LoweredUserName. Согласно рекомендациям Microsoft и правилу анализа кода Visual Studio CA1308 , я должен использовать C # String.ToUpperInvariant () вместо ToLower (). По мнению Microsoft, это проблема как производительности, так и глобализации: преобразование в верхний регистр является безопасным, в то время как преобразование в нижний регистр может привести к потере информации (например, турецкая проблема «I» ).

Если я перейду к использованию ToUpperInvariant для нормализации строк, мне также придется изменить схему своей базы данных, поскольку моя схема основана на Microsoft ASP.NET Membership framework (см. этот связанный вопрос ), которая нормализует строки в нижний регистр.

Разве Microsoft не противоречит сама себе, говоря нам использовать нормализацию в верхнем регистре в C #, в то время как ее собственный код в таблицах и процедурах Членства использует нормализацию в нижнем регистре? Стоит ли переключать все на нормализацию в верхнем регистре или просто продолжать использовать нормализацию в нижнем регистре?

Ответы [ 3 ]

6 голосов
/ 21 апреля 2009

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

3 голосов
/ 21 апреля 2009

Чтобы ответить на ваш первый вопрос, да, Microsoft немного противоречива. Чтобы ответить на второй вопрос, не переключайте ничего, пока не подтвердите, что это вызывает узкое место в вашем приложении.

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

Помните:

Преждевременная оптимизация - корень всего зла (или, по крайней мере, большей его части) в программировании. - Дональд Кнут

0 голосов
/ 21 апреля 2009

Продолжайте использовать нормализацию в нижнем регистре. Изменяйте его в соответствии со стандартами Microsoft только в случае возникновения серьезной проблемы.

Это прискорбно, но стоит. К сожалению, «стандарты» Microsoft, как правило, плохо продуманы и несколько менее последовательны; опыт работы с ними показал, что если нет веских причин, лучше просто придерживаться того, что работает, пока оно работает. Обратите внимание, что это, как правило, не относится к технологиям сторонних разработчиков; но произвол «стандартов» Microsoft делает их достойными избегания.

Редактировать: я должен уточнить здесь; мое мнение о Microsoft очень низкое, из-за большого опыта работы со своими стандартами. Как отмечалось в комментариях, у меня нет конкретных ссылок, чтобы указать на «всех, кроме Microsoft»; это только из моего личного опыта. Ваш пробег может меняться широко. Этот ответ следует считать действительно только моим мнением. Извините, что не уточнил это раньше.

...