Могу ли я безопасно игнорировать предупреждение CodeAnalysis:замените string == “” на string.Совсем пусто?

StackOverflow https://stackoverflow.com/questions/1661024

  •  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) и сравните со строкой.Пустой

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top