当@No One回答我的问题here时,他提到了类似下面的内容,
using(SomeClass c = new SomeClass())
{ }
**
将转换为
**
try
{
SomeClass c = new SomeClass();
}
finally
{
c.Dispose();
}
那么,你怎么说呢?
另外,你们中的一些人提到“内部会以某种方式实施”,你如何看待内部实现的东西?
例如,当我浏览MSDN中的“泛型概念”时,他们说List是通用的,并展示了如何在内部实现list的示例实现here。我们如何真正为他人做到这一点?
我在VS 2010中尝试过。但是对象浏览器只显示特定类型的方法或字段。
(我只是好奇,因为列表内部实现的例子真棒。非常有趣!)
答案 0 :(得分:3)
C# specification在第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源代码可供浏览器/下载使用。请检查此问题:Downloadable/browsable version of the .NET Framework source code?
答案 1 :(得分:3)
Marcin已经使用using
声明为您在此处讨论的特定转换做了准备。但是,您还应该了解Reflector和dotPeek(还有更多)以及ildasm等工具。
Reflector和dotPeek会将您的代码从编译后的代码反编译回C#,具有各种级别的“优化”(基本上它尝试进行C#编译器转换的难度),并且它们还允许您查看IL - 是ildasm
给你的东西。
IL为您提供了关于编译代码的最终答案,但经常查看反编译代码(特别是关闭“优化”,或者设置反编译器以提供C#2代码)可以更简单。
值得注意的是,编译器执行的许多转换将使用“unspeakable names”来生成额外的类型,字段和方法。例如,如果你有:
Action foo = () => Console.WriteLine("I'm a lambda!");
然后可能会生成一个名为<Main>b__0
的方法。您将无法在普通C#中引用此内容(因为C#标识符不能包含<
或>
),但它是有效的IL。
答案 2 :(得分:2)
听起来你正在寻找一个反编译器。有several to choose from,但受欢迎的免费版ILSpy。还有dotPeek是免费的。如果您想要更多功能并且不介意花钱,您可能需要查看.Net Reflector。