这是Resharper中的错误吗?

时间:2012-09-06 22:40:14

标签: c# refactoring resharper automated-refactoring

我有这段代码:

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”是我抓住下一个arg的指示:

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;
        } 
    }
}

2 个答案:

答案 0 :(得分:1)

Reshaper想要的是这样的:

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

请注意,代码始终将incomingPlatypusID设置为"-AA"(如果args包含它)。

提高可读性并将grabNext放入其所属的范围,因为它仅在那里使用。

以下是更多信息:Scope of variables in 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;
    }
} 

答案 1 :(得分:1)

将grabNext声明为for each,你可以使用之前的arg值为grabNext,因为只有当arg ==“-AA”时它才会被覆盖。

GrabNext在上一次迭代中可能是真的。