Могу ли я безопасно игнорировать предупреждение CodeAnalysis:замените string == “” на string.Совсем пусто?
-
12-09-2019 - |
Вопрос
У меня есть код, похожий на этот:
string s = CreateString();
if (s == "") foo(s);
Если s равно "", следует вызвать foo .Если string имеет значение null, чего никогда не должно происходить, то NullReferenceException - это нормально (поскольку это, в конце концов, исключительная ситуация).
CodeAnalysis советует мне проверить наличие s.Абсолютно пустой.Это изменило бы функциональность непреднамеренным образом.
Производительность - это не проблема.
Безопасно ли подавлять соответствующее предупреждение CA1820?
Редактировать: Обновлен пример кода и текст, чтобы лучше отражать мой случай.
Редактировать: Это (слегка измененный) фактический код (он находится в стандартной реализации IXmlSerializable):
public void ReadXml (XmlReader reader)
// ...
string img = reader.ReadElementString ("Image");
if (img != "") {
Image = Image.FromFile(img);
}
// ...
Решение
Он будет вести себя по-разному в отношении нулей, так что это зависит от того, что вы хотите, чтобы произошло;вы упомянули об этом NullReferenceException
было бы нормально, но в процитированном коде нет ничего, что могло бы вызвать это, следовательно, это может привести к неожиданным ошибкам ниже по течению.
Я никогда иметь, но меня всегда так и подмывает добавить:
static bool IsNullOrEmpty(this string value) {
return string.IsNullOrEmpty(value);
}
так что я могу использовать:
if (s.IsNullOrEmpty()) foo();
Другие советы
Технические характеристики :
Если s равно "", следует вызвать foo .Если строка равна null, что никогда не должно произойдет, тогда исключение NullReferenceException в порядке.
Просто проверьте длина строки как указано в правиле CodeAnalysis :
if (s.Length == 0) foo(s);
Ваш вопрос :
Безопасно ли подавлять связанные Предупреждение CA1820?
Вы можете проигнорировать это, ваш код будет работать, но я бы вам этого не советовал, следуйте рекомендациям столько, сколько сможешь.Даже если тема (производительность) не является проблемой, ваш код будет более последовательным, и вы привыкнете писать стандартный код.
С каждым предупреждением анализа кода связана документация, доступ к которой можно получить, выделив предупреждение и нажав F1.Вы также можете щелкнуть правой кнопкой мыши по этому элементу, чтобы получить справку.
В любом случае, вот документация, объясняющая это конкретное предупреждение.
Согласно этой документации, "безопасно подавлять предупреждение из этого правила, если производительность не является проблемой".
Было бы лучше написать тест в виде:
if(s != null && s == "")
Затем вы можете обработать нулевое значение в другом операторе if
На самом деле вы не игнорируете предупреждение, вы просмотрели код и решили, что предупреждение не применяется.Это вполне разумное условие, при котором можно подавить предупреждение.
Чистая Спекуляция
Однако мне хотелось бы знать немного больше о том, что вы пытаетесь сделать.Я подозреваю, что может быть лучший способ справиться с этим.Шаблон напоминает мне о возврате сообщения об ошибке или пустого значения, сигнализирующего об успешном выполнении метода.Если это так, я бы рассмотрел либо возврат void и выдачу исключения при сбое, либо возврат bool и выдачу исключений только тогда, когда сообщение является критическим, и возврат true / false в противном случае.
Если значение null в порядке, с вами все будет в порядке в любом случае.
ДА.
Но я бы согласился с CodeAnalysis с помощью string.IsNullOrEmpty - безопасный выбор.
Не обрабатывать исключение, в то время как вы можете, в целом плохая идея, поэтому CA прав в том, что вам либо нужно обрабатывать null как пустой, либо обрабатывать исключение.Исключение с нулевой ссылкой, вызванное использованием возвращаемого значения, - это очень плохая вещь.По крайней мере, запустите Отладку.Подтвердите (s!=null) и сравните со строкой.Пустой