1

当@No One 在这里回答我的问题时,他提到了如下内容,

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

**

将转化为

**

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

好吧,你怎么看出来的?

另外,你们中的一些人提到“内部会以某种方式实现”,您如何看待某事的内部实现?

例如,当我浏览 MSDN 中的“泛型概念”时,他们说 List 是泛型的,并在此处展示了如何在内部实现 list 的示例实现。我们如何真正为其他人得到它?

我在 VS 2010 中尝试过。但是对象浏览器只显示特定类型的方法或字段。

(我只是好奇,因为 list 的内部实现的例子太棒了。真的很有趣!)

4

3 回答 3

3

C# 规范在第 8.13 章对此进行了解释:

形式的使用语句

using (ResourceType resource = expression) statement

对应于三种可能的扩展之一。当 ResourceType 是不可为空的值类型时,扩展为

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

否则,当 ResourceType 为可空值类型或引用类型而不是动态时,扩展为

{
  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();
  }
}

关于您的第二个问题:.NET 源代码可用于浏览器/下载。检查这个问题:.NET Framework 源代码的可下载/可浏览版本?

于 2013-09-05T06:26:47.563 回答
3

Marcin 已经为您在此处谈论的特定转变,通过using声明确定了这一点。但是,您还应该了解ReflectordotPeek(还有更多)以及ildasm等工具。

ildasmReflector 和 dotPeek 会将您的代码从已编译的代码反编译回 C#,具有各种级别的“优化”(基本上,它尝试进行 C# 编译器的转换有多难)并且它们还允许您查看 IL -这就是你也是。

IL 为您提供了关于编译后的代码是什么样子的最终答案,但经常查看反编译的代码(尤其是关闭“优化”,或者设置反编译器以提供 C# 2 代码)可能更简单。

值得注意的是,编译器执行的许多转换将使用“不可描述的名称”来生成额外的类型、字段和方法。例如,如果您有:

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

那么这可能会生成一个名为<Main>b__0. 您将无法在普通 C# 中引用它(因为 C# 标识符不能包含<or >),但它是有效的 IL。

于 2013-09-05T06:30:46.397 回答
2

听起来您正在寻找反编译器。有几种可供选择,但一种流行的免费软件是ILSpy。还有免费的dotPeek。如果您想要更多功能并且不介意花钱,您可能需要查看.Net Reflector

于 2013-09-05T06:28:49.667 回答