可以在c#中查看类型T的内部实现

时间:2013-09-05 06:19:16

标签: c# .net generics .net-4.0

当@No One回答我的问题here时,他提到了类似下面的内容,

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

**

  

将转换为

**

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

那么,你怎么说呢?

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

例如,当我浏览MSDN中的“泛型概念”时,他们说List是通用的,并展示了如何在内部实现list的示例实现here。我们如何真正为他人做到这一点?

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

(我只是好奇,因为列表内部实现的例子真棒。非常有趣!)

3 个答案:

答案 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声明为您在此处讨论的特定转换做了准备。但是,您还应该了解ReflectordotPeek(还有更多)以及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