4

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: code-construct のアセンブリという単語を変更しました。

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

2 に答える 2

2

C++ や C# のアセンブリなどというものはありません。コードがコンパイルされると、ILCode になります。リフレクターはこの ILCode を受け取り、選択した言語に逆コンパイルします。

これにより、ILCode では有効でも、ターゲット言語では無効なコードになる可能性があります。

于 2012-06-27T13:26:31.737 に答える
0

IL へのコンパイルは多対 1 の操作であり、逆コンパイラには、逆コンパイル時に選択する多くの選択肢のどれに関する規則があります。多くの場合、異なる言語で生成される IL は、別の言語で直接再現することはできません。

この場合、逆コンパイラの選択が適切でなく、生成された C# が無効であるか (逆コンパイラのバグ)、またはコードを同等の C# に逆コンパイルできません。

于 2012-06-27T13:25:56.657 に答える