1

ここで@No Oneが私の質問に答えていたとき、彼は以下のようなことを述べていました。

 using(SomeClass c = new SomeClass())
 { }

**

に変換されます

**

 try
 {
     SomeClass c = new SomeClass();
 }
 finally
 {
   c.Dispose();
 }

さて、あなたはそれをどのように伝えますか?

また、「内部的には何らかの形で実装される」とおっしゃる方もいらっしゃいますが、何かの内部実装についてはどうお考えですか?

たとえば、MSDN で「ジェネリックの概念」を閲覧していたときに、List はジェネリックであり、list が内部でどのように実装されているかのサンプル実装がここに示されていると述べています。どうすれば他の人にそれを本当に手に入れることができますか?

VS 2010 で試してみました。しかし、オブジェクト ブラウザーには、特定の型で公開されているメソッドまたはフィールドのみが表示されます。

(リストの内部実装の例はただ素晴らしいので、私はただ興味があります。本当に興味深いものです!)

4

3 に答える 3

3

Marcin は、あなたがここで話している特定の変革について、次のようにusing述べています。ただし、 ReflectordotPeek (他にも多数あります)やildasmなどのツールにも注意する必要があります。

Reflector と dotPeek は、コンパイルされたコードから C# にコードを逆コンパイルし、さまざまなレベルの「最適化」 (基本的に、C# コンパイラの変換を行うのがどれだけ難しいか) を行い、IL を確認することもできますildasm。あなたも。

IL は、コンパイルされたコードがどのように見えるかについて最終的な答えを提供しますが、多くの場合、逆コンパイルされたコード (特に「最適化」がオフになっている場合、または C# 2 コードを提供するように逆コンパイラを設定している場合) を見る方が簡単な場合があります。

コンパイラによって実行される変換の多くは、生成される追加の型、フィールド、およびメソッドに「言いようのない名前」を使用することに注意してください。たとえば、次の場合:

Action foo = () => Console.WriteLine("I'm a lambda!");

のようなメソッドが生成される場合があり<Main>b__0ます。通常の C# ではこれを参照することはできません (C# の識別子に<orを含めることはできないため>) が、有効な IL です。

于 2013-09-05T06:30:46.397 に答える
3

C# 仕様では、8.13 章でこれについて説明しています。

フォームの using ステートメント

using (ResourceType resource = expression) statement

3 つの可能な拡張のいずれかに対応します。ResourceType が null 非許容値型の場合、展開は次のようになります。

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}

それ以外の場合、ResourceType が null 許容値型または動的以外の参照型である場合、展開は次のようになります。

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}

それ以外の場合、ResourceType が動的な場合、拡張は

{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}

そして、2 番目の質問について: .NET ソース コードは、ブラウザー/ダウンロードで利用できます。次の質問を確認してください: .NET Framework ソース コードのダウンロード可能/参照可能なバージョンは?

于 2013-09-05T06:26:47.563 に答える
2

逆コンパイラを探しているようです。選択できるものはいくつかありますが、人気のある無料のものはILSpyです。無料のdotPeekもあります。より多くの機能が必要で、お金を使うことを気にしない場合は、.Net Reflectorを参照してください。

于 2013-09-05T06:28:49.667 に答える