2009-11-02 3 views
3

У меня есть код, подобный этому:Могу ли я безопасно игнорировать предупреждение CodeAnalysis: заменить строку == "" на string.IsNullOrEmpty?

string s = CreateString(); 
if (s == "") foo(s); 

Если s равен «», Foo должен быть вызван. Если строка является нулевой, что никогда не должно происходить, то исключение NullReferenceException прекрасно (поскольку это, в конце концов, исключительная ситуация).

CodeAnalysis говорит мне протестировать s.IsNullOrEmpty. Это изменило бы функциональность в нулевой последовательности.

Производительность не является проблемой.

Безопасно ли предотвращать связанное с ним предупреждение CA1820?

Редактировать: Обновленный образец кода и текст, чтобы лучше отразить мой случай.

Edit: Это (немного изменен) фактический код (это в стандартной IXmlSerializable реализации):

public void ReadXml (XmlReader reader) 
    // ... 
    string img = reader.ReadElementString ("Image"); 
    if (img != "") { 
     Image = Image.FromFile(img); 
    } 
    // ... 

ответ

4

Он будет вести себя по-разному по отношению к нулям, так что это зависит, что вы хочу случиться; вы упомянете, что NullReferenceException будет в порядке, но в приведенном коде нет ничего, что могло бы поднять это, следовательно, это может привести к неожиданным ошибкам вниз по течению.

Я никогда не есть, но я всегда соблазн добавить:

static bool IsNullOrEmpty(this string value) { 
    return string.IsNullOrEmpty(value); 
} 

так что я могу использовать:

if (s.IsNullOrEmpty()) foo(); 
предупреждение
+0

Вам не хватает «этого» внутри круглой скобки, чтобы сделать метод расширением;) Так или иначе, я использовал это в течение длительного времени ... он просто читается намного лучше. – em70

+0

Я уже добавил отсутствующее «это» в «oops I'm a muppet» edit ;-p –

+0

Вы, британцы, и ваши афоризмы. Заставляет меня хотеть переехать в Великобританию. – tvanfosson

0

Если нуль в порядке, вам будет хорошо в любом случае.

0

Да.

Но я бы согласился с CodeAnalysis с string.IsnullOrEmpty - это безопасный выбор.

1

Было бы лучше, чтобы написать тест как:

if(s != null && s == "") 

Вы можете обрабатывать нулевое значение в другой, если заявление

+0

Добавление дополнительного теста на нуль имеет смысл и устраняет предупреждение. Простая, но хорошая идея. – mafu

2

Каждый Анализ кода имеет сопроводительную документацию, что вы можете получить доступ, highligting предупреждение и прессование F1. Вы также можете щелкнуть правой кнопкой мыши элемент, чтобы получить справку.

В любом случае, вот documentation that explains that particular warning.

В соответствии с этой документацией, это безопасно для предотвращения предупреждения из этого правила, если производительность не является проблемой ».

0

Не обрабатывая исключение, в то время как вы Can Can not gennerally - плохая идея, поэтому CA прав, поскольку вам нужно либо обрабатывать null как пустое, либо обрабатывать исключение. Исключение нулевой ссылки, вызванное использованием возвращаемого значения, очень плохо. По крайней мере, введите Debug.Assert (s! = Null) и сравните с строкой.Пустой

+0

Мое понимание вопроса в том, что метод никогда не возвращает null. В этом случае это действительно было бы исключительным условием и было бы нормально выбросить исключение. Да, это плохо, но на основе его кода это никогда не должно происходить. – tvanfosson

1

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

Чистая Спекуляция

Я хотел бы знать немного больше о том, что вы пытаетесь сделать, однако. Я подозреваю, что может быть лучший способ справиться с этим. Шаблон напоминает мне о возврате сообщения об ошибке или пустой, чтобы сигнализировать об успешности метода. Если это так, я бы рассмотрел либо возврат void, либо исключение исключения при ошибке, либо возврат bool и исключение только исключений, когда сообщение является критическим, и в противном случае возвращает true/false.

+0

Я отправлю фактический код. – mafu

3

Характеристики:

Если s равен "", Foo должен быть вызван. Если строка является нулевой, что никогда не должно происходить , тогда исключение NullReferenceException в порядке.

Просто test the string length as adviced in the CodeAnalysis rule:

if (s.Length == 0) foo(s); 

Ваш вопрос:

Безопасно подавить связанное предупреждение CA1820?

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