На некоторых языках (например, C++) Вы не можете использовать операторы как == для сравнений строк, поскольку это сравнило бы адрес строкового объекта а не саму строку. Однако в C# можно использовать == для сравнения строк, и он на самом деле сравнит содержание строк. Но существуют также строковые функции для обработки таких сравнений, таким образом, мой вопрос; должны Вы?
Учитывая две строки:
string aa = "aa";
string bb = "bb";
Если Вы сравниваете их как это:
bool areEqual = (aa == bb);
Или если Вы используете Равную функцию, как это:
bool areEqual = aa.Equals(bb);
Есть ли так или иначе какое-либо техническое различие? Или разумные аргументы в пользу лучшей практики?
Я бы не использовал:
aa.Equals(bb)
если бы я не знал aa
не мог возможно быть нулевым. Я мог бы использовать:
string.Equals(aa,bb)
, но в основном я бы использовал то, что хотел бы использовать один из специфических StringComparison
режимов (инвариантный, порядковый, нечувствительный к регистру и т.д.). Хотя я мог бы также использовать реализации StringComparer
, так как их немного проще абстрагировать (например, перейти в Dictionary
для нечувствительного к регистру порядкового словаря). Для общего использования
a == b
хорошо.
.Технической разницы нет (если только aa не является нулевым). Используйте то, что выглядит лучше для вас. На мой взгляд, использование перегрузок операторов делает код более понятным.
Используйте функции, когда вам нужны (или могут понадобиться в будущем) их дополнительные аргументы (как в CompareTo())
.Лучше всего всегда использовать функцию Equals() для сравнения строк. Это дает понять, когда кто-то другой читает ваш код, что вы конкретно хотите, чтобы строки сравнивались.
.Это реализация оператора:
public static bool operator == (String a, String b) {
return String.Equals(a, b);
}
Не теряйте из-за этого сон.
вообще говоря, == делает равенство указателей, в то время как .равно проверяет, равны ли атрибуты. Так что если вы сделали что-то вроде
a = 'a';
b = 'a';
bool c = (a == b);
bool d = (a.Equals(b))
то c должно возвращать false и d должно быть true.
.