Является ли хорошей практикой сравнивать строку C # с '=='? - PullRequest
6 голосов
/ 18 ноября 2011

Полезно ли сравнивать строки с ==?Существует ли эквивалент s1 == s2 в терминах Compare и Equals методов для string.Если использовать эти методы, без указания CultureInfo FxCop выдаст предупреждение, это реальная проблема?

Ответы [ 5 ]

14 голосов
/ 18 ноября 2011

Оператор == - это обычное сравнение строк, не учитывающее культуру. Он использует тот же внутренний вызов, что и .Equals, и вполне подходит для "обычного" сравнения строк.

Если вам нужны культурно-ориентированные сравнения (например, для целей графического интерфейса), например немецкий double-s или ß, используйте

CultureInfo ci = new CultureInfo("de-DE");
String.Compare("Strasse", "Straße", true, ci)
2 голосов
/ 19 ноября 2011

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

Эта статья о dotnetperls рассматривает влияние на производительность и даже показывает IL и тесты для двух методов сравнения строк (== и equals).

И, наконец, этот вопрос показывает, что == является строго порядковым сравнением строк и не подходит для локализованных строк.

2 голосов
/ 18 ноября 2011

Когда вы сравниваете строки, вы должны использовать методы, которые явно указывают, какой тип сравнения вы намереваетесь выполнить. Это делает ваш код более удобным и читаемым. По возможности используйте перегрузки методов классов System.String и System.Array, которые принимают параметр перечисления StringComparison, чтобы вы могли указать, какой тип сравнения выполнять. Лучше избегать использования операторов == и! = При сравнении строк. Кроме того, избегайте использования методов экземпляра String.CompareTo, поскольку ни одна из перегрузок не принимает StringComparison.

В зависимости от ваших потребностей, вы можете использовать один из следующих методов:

bool result = root.Equals(root2, StringComparison.Ordinal);
result = root.Equals(root2, StringComparison.OrdinalIgnoreCase);
bool areEqual = String.Equals(root, root2, StringComparison.Ordinal);

Источник для этого ответа: http://msdn.microsoft.com/en-us/library/cc165449.aspx

1 голос
/ 19 ноября 2011

Если строка может быть нулевой или пустой (иначе ""), вы хотите использовать string.IsNullOrEmpty (...);

В противном случае это нормально в моей книге или в большинстве других вещей.Зависит от того, что вы делаете.

1 голос
/ 18 ноября 2011

Да, с этой практикой все в порядке.Вы также можете использовать String.Compare , и сравнение лучших практик, найденных в Лучшие практики использования строк в .NET Framework .

Да, FxCop, дастпредупреждения, но предупреждения - это предупреждения.Если вы не заботитесь о культуре, их можно игнорировать.Но, как и в случае с предупреждениями из реальной жизни, иногда стоит их учитывать.

...