Это ошибка в Resharper?

У меня был этот код:

string[] args = Environment.GetCommandLineArgs();
bool grabNext;
foreach (string arg in args)
{
    if (arg == "-AA")
    {
        grabNext = true;
    }
    if (grabNext)
    {
        incomingPlatypusID = arg;
    }
}

... и Resharper предложил объявить "bool grabNext" во внутренней области, поэтому, когда я это разрешил, код стал таким:

string[] args = Environment.GetCommandLineArgs();

foreach (string arg in args)
{
    if (arg == "-AA") ;
    bool grabNext;
    {
        grabNext = true;
    }
    if (grabNext)
    {
        incomingPlatypusID = arg;
    }
}

... затем, конечно, я получил сообщение об ошибке, а именно: «Пустое тело управляющего оператора»

ОБНОВИТЬ

На самом деле, я думаю, что мне нужно следующее, поскольку "-AA" указывает мне на получение следующего аргумента:

foreach (string arg in args)
{
    if (arg == "-AA")
    {
        grabNext = true;
        continue;
    } 
    if (grabNext)
    {
        PlatypusID = arg;
        break;
    } 
}

ОБНОВЛЕНИЕ 2

С этим кодом Resharper не жалуется:

private void AutoProvMainForm_Load(object sender, EventArgs e)
{
    string[] args = Environment.GetCommandLineArgs();
    bool grabNext = false;

    foreach (string arg in args)
    {
        if (arg == "-AA")
        {
            grabNext = true;
            continue;
        } 
        if (grabNext)
        {
            PlatypusID = arg;
            break;
        } 
    }
}

person B. Clay Shannon    schedule 06.09.2012    source источник
comment
Это сделал ReSharper? bool grabNext должно быть перед if   -  person Andre Calil    schedule 07.09.2012
comment
Похоже, что ReSharper не делал ничего, кроме поиска фигурной скобки перед этим назначением и вставки объявления (очевидно, игнорируя if). Я бы сказал, отправьте его команде ReSharper.   -  person Brad Christie    schedule 07.09.2012
comment
Его просто проверить. Напишите свой код еще раз и посмотрите, внесет ли re-sharper точно такие же изменения. Я думаю, что это была случайность, но если вы можете ПЕРЕПРОИЗВОДИТЬ это (каждый разработчик должен знать, что это важно), то отправьте повторное видео о вашей способности воспроизвести ошибку, и вы обнаружили у себя ошибку. Поздравляю.   -  person bugnuker    schedule 07.09.2012
comment
Кстати, в вашем коде нет логической ошибки? Разве у вас не должно быть что-то вроде else { grabNext = false; }? Потому что после первого true все остальные будут сохранены   -  person Andre Calil    schedule 07.09.2012
comment
@Andre: Хороший звонок; Мне нужно вырваться из этого, как только это станет правдой.   -  person B. Clay Shannon    schedule 07.09.2012
comment
@ClayShannon Так что вам это логическое значение в конце концов не нужно. Просто протестируйте, получите идентификатор и разорвите цикл   -  person Andre Calil    schedule 07.09.2012
comment
Я также не могу скомпилировать ваш исходный код. grabNext не инициализируется перед использованием. Мы сможем быть более полезными, если вы опубликуете именно то, что было в исходном коде, или хотя бы подмножество, вызывающее ту же ошибку.   -  person Dax Fohl    schedule 07.09.2012
comment
Я предполагаю, что вам фактически нужен аргумент после -AA, а не сама строка -AA. Было бы проще написать args[args.ToList().IndexOf("-AA") + 1] или args.SkipWhile(arg => arg != "-AA").Skip(1).FirstOrDefault()   -  person Dax Fohl    schedule 07.09.2012
comment
@ClayShannon: обновил мой ответ в соответствии с вашим последним редактированием. Вместо этого используйте цикл For.   -  person Tim Schmelter    schedule 07.09.2012


Ответы (2)


То, что хочет Reshaper, выглядит примерно так:

foreach (string arg in args)
{
    bool grabNext = (arg == "-AA");
    if (grabNext)
    {
        incomingPlatypusID = arg;
        // probably better break now:
        break;
    }
}

Обратите внимание, что код всегда устанавливает incomingPlatypusID в "-AA" (если это содержится в args).

Повышает удобочитаемость и помещает grabNext в область, к которой он принадлежит, поскольку он используется только там.

Вот дополнительная информация: Область действия переменных в C#

Выдержка:

В C# их лучше размещать в той области, где они необходимы. Это имеет несколько преимуществ, в том числе:

  • Вы снижаете риск ошибки из-за неправильного повторного использования переменной, особенно во время долгосрочного обслуживания.
  • Вы держите переменную ограниченной в этой области, что упрощает рефакторинг

Обратите внимание, что тот же оператор может быть еще более читабельным с помощью Linq:

incomingPlatypusID = args.FirstOrDefault(a => a == "-AA");

Изменить: обновить в соответствии с измененным вопросом. Вместо этого используйте for-loop, если вы хотите использовать индексатор.

for( int i = 0; i < args.Length; i++ )
{
    if( args[i] == "-AA" && i+1 < args.Length )
    {
         incomingPlatypusID = args[ i+1 ];
         break;
    }
} 
person Tim Schmelter    schedule 06.09.2012

с помощью grabNext, объявленного вне for each, вы можете иметь предыдущее значение arg для grabNext, поскольку оно переопределяется только в том случае, если arg == "-AA".

GrabNext может быть истинным из предыдущей итерации.

person g williams    schedule 06.09.2012