C#for循环循环表达式语法

时间:2012-06-27 13:23:30

标签: c#-4.0 for-loop syntax reflector dotpeek

关于C#中for循环的循环表达,我有一个很好的问题。

我总是喜欢学习和扩展我的知识,因此我经常使用反射器来寻找和学习其他知识。最近我在装配中四处寻找,我认为这是一个C#装配。

我遇到了这个:

public virtual void DoRows(Parse rows)
{
  for (; rows != null; {
    Parse more;
    rows = more;
  }
  )
  {
    more = rows.More;
    this.DoRow(rows);
  }
}

我从来不知道我可以在循环表达式中使用代码块。所以我启动了MSDN并查看了C#的语言参考但没有找到任何内容。

C ++参考显示了一些有趣的东西(http://msdn.microsoft.com/en-us/library/b80153d8.aspx),但我不是一个C ++开发者,我有一种强烈的感觉,这个组件不是用C ++编写。

dotPeek说该程序集是一个v4.0.30319 / msil程序集。

现在有以下问题:   - 这是C ++还是C#代码构造?!   - 我们可以在C#中做这样的事吗?

我无法重现看起来像这样的代码并在VS2010中编译。

@edit:更改了代码构造中的单词assembly。

@edit II:谢谢你的所有答案。我认为这是dotPeek反射器中的一个错误,或者我们发现了一些for-loop-expression复活节彩蛋。这就是Red Gate对同一方法所说的话:

public virtual void DoRows(Parse rows)
{
    while (rows != null)
    {
        Parse more = rows.More;
        this.DoRow(rows);
        rows = more;
    }
}

2 个答案:

答案 0 :(得分:2)

没有C ++或C#程序集这样的东西。编译代码后,它就是ILCode。反射器使用此ILCode并将其反编译为您选择的语言。

这可能导致代码在ILCode中有效,但在目标语言中无效。

答案 1 :(得分:0)

编译到IL是一个多对一的操作,反编译器有关于他们在反编译时选择的众多选择中的哪一个的规则。通常,不同语言产生的IL不可能直接以另一种语言再现。

在这种情况下,反编译器选择不好并且生成的C#无效(反编译器中的错误),或者它无法将代码反编译成等效的C#。