c #: поиск ошибок: if (false) - PullRequest
8 голосов
/ 20 апреля 2011

Я только что нашел ошибку в моей программе (после некоторой отладки и порчи волос)

bool first = true;

foreach (RdAbstractNode node in listNodes)
{
    if (!first)
    {
        // do stuff (does not change first)
    }
    // do more stuff (does not change first)
}

Как видите, first всегда true - никогда не менялось.Таким образом, if(!first) в основном if(false).
Компилятор не выдал предупреждение, хотя он установлен на уровень 4 (самый высокий уровень).

Как я могу найти похожие if(false) ошибки?

Я использую VS 2010, компилятор .Net 4.0, настройки проекта .Net 2.0

Ответы [ 4 ]

13 голосов
/ 20 апреля 2011

С Resharper вы получите такие предупреждения

enter image description here

10 голосов
/ 20 апреля 2011

Я не знаю функции компилятора, которая вам поможет - вам нужны юнит-тесты.

1 голос
/ 20 апреля 2011

Я согласен, что Resharper - хороший инструмент, но я хотел бы добавить, что я думаю, что это демонстрирует причину НЕ использовать эту конструкцию.

Альтернативой может быть:

РЕДАКТИРОВАТЬ:

//.net 4.0
    var firstNode = listNodes.First(); 
       //do something special for first. 

    foreach(var node in listNodes.Skip(1)) 
    {
       //do something for the rest.
    }

//.net 2.0
using (IEnumerator<RdAbstractNode> enumerator = listNodes.GetEnumerator();)
{
    if (!enumerator.MoveNext())
       return;

    RdAbstractNode first = enumerator.Current; 
    //do something with first
    while(enumerator.MoveNext()) 
    { 
       RdAbstractNode currentNode = enumerator.Current;
       //do something with the node.
    } 
}

Мы часто нуждаемся в какой-то специальной обработке для первого элементаИногда лучше изменить логику и сделать всю обработку единообразной.Если мы не можем, то я всегда предпочитаю четко отделять обработку специального случая от остальных элементов, а не вкладывать ее.

0 голосов
/ 20 апреля 2011

Компилятор предупредит вас о таких очевидных вещах, как недоступный код, основанный на постоянном значении в операторе if - например, "if (false)"Однако, поскольку переменная может быть изменена, в этом случае, к сожалению, этого не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...