Анализ кода не показывает предупреждение CA1804, несмотря на неиспользованную локальную строковую переменную в C # (VS2010 Premium) - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть следующий код, который не выдает предупреждение CA1804 (объявленная переменная никогда не используется) из анализа кода (VS2010 Premium):

...
if( boolVariable )
{
    string errorText = "Bla Bla Bla"; // Never used
    ErrorProvider.SetError( SomeControl, "Some Warning" );
}
else
{
    string errorText = "Acme Acme Acme"; // Used below
    ErrorProvider.SetError( SomeControl, errorText );
}
...

Когда я удаляю строки ErrorProvider.SetError (...) , отображается предупреждение CA1804, но почему это не так в приведенном выше примере кода?

(Кстати: сам код не слишком хорош и показан только для иллюстрации моего вопроса.)

Есть идеи, что может быть причиной такого поведения? Я думаю, это может быть связано с тем фактом, что код IL оптимизирован таким образом, что объявление выходит за пределы , если , что, в свою очередь, означает, что предупреждение действительно не должно отображаться в примере, подобном один выше, но я не уверен, правда ли это.

Заранее спасибо

G.

1 Ответ

3 голосов
/ 21 ноября 2011

Это было бы из-за оптимизации, выполняемой компилятором C #. В сгенерированном IL объявление переменной выводится из блока if:

string errorText;
if (boolVariable)
{
    errorText = "Bla Bla Bla";
    this.ErrorProvider.SetError(this.SomeControl, "Some Warning");
}
else
{
    errorText = "Acme Acme Acme";
    this.ErrorProvider.SetError(this.SomeControl, errorText);
}

Удаление только второго вызова SetError на самом деле достаточно для запуска CA1804.

Кстати, компилятор C # должен был выдать предупреждение CS0219 для этого, которое вы явно проигнорировали. Я бы настоятельно рекомендовал рассматривать предупреждения компилятора как ошибки, если вы удаленно заинтересованы в качестве кода, что, вероятно, так и есть, если вы запускаете Code Analysis. Зачем добавлять дополнительный инструмент скрининга, прежде чем использовать все преимущества того, что вы уже используете?

...