C# 在c中看到T型内部实现的可能性

C# 在c中看到T型内部实现的可能性,c#,.net,generics,.net-4.0,C#,.net,Generics,.net 4.0,当@没有人回答我的问题时,他提到了下面这样的事情 using(SomeClass c = new SomeClass()) { } ** 将转化为 ** 你怎么知道的 另外,你们中的一些人提到,它将以某种方式在内部实现,您如何看待某些东西的内部实现 例如,当我浏览MSDN中泛型的概念时,他们说List是泛型的,并展示了如何在内部实现List的示例实现。我们如何才能真正为其他人做到这一点 我试过VS2010。但对象浏览器仅显示特定类型的公开方法或字段 我只是好奇,因为list的内部实现的例子

当@没有人回答我的问题时,他提到了下面这样的事情

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

将转化为

**

你怎么知道的

另外,你们中的一些人提到,它将以某种方式在内部实现,您如何看待某些东西的内部实现

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

我试过VS2010。但对象浏览器仅显示特定类型的公开方法或字段

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

在第8.13章中解释了这一点:

表单的using语句

using (ResourceType resource = expression) statement
对应于三种可能的扩展之一。当ResourceType为 一种不可为null的值类型,扩展名为

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}
否则,当ResourceType是可为null的值类型或引用时 类型而非动态,扩展为

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}
否则,当ResourceType是动态的时,扩展是

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}
关于第二个问题:.NET源代码可供浏览/下载。勾选此问题:

在第8.13章:

表单的using语句

using (ResourceType resource = expression) statement
对应于三种可能的扩展之一。当ResourceType为 一种不可为null的值类型,扩展名为

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}
否则,当ResourceType是可为null的值类型或引用时 类型而非动态,扩展为

{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  try {
      statement;
  }
  finally {
      if (resource != null) ((IDisposable)resource).Dispose();
  }
}
{
  ResourceType resource = expression;
  IDisposable d = (IDisposable)resource;
  try {
      statement;
  }
  finally {
      if (d != null) d.Dispose();
  }
}
否则,当ResourceType是动态的时,扩展是

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

关于第二个问题:.NET源代码可供浏览/下载。检查此问题:

听起来您正在寻找反编译器。有,但一个流行的免费的是。还有一种是免费的。如果你想要更多的功能并且不介意花钱,你可能想看看。

听起来你在寻找一个反编译器。有,但一个流行的免费的是。还有一种是免费的。如果您想要更多的功能,并且不介意花钱,您可能想看看。

Marcin已经为您在这里讨论的特定转换确定了使用语句。但是,您还应该了解像和这样的工具,还有很多

Reflector和dotPeek将把您的代码从编译后的代码反编译回C,并进行各种级别的优化,以尝试进行C编译器的转换,基本上,它们还允许您查看IL-这也是ildasm提供给您的

IL为您提供了关于编译代码的最终答案,但是经常查看反编译代码(尤其是在关闭优化的情况下),或者将反编译器设置为提供C2代码(例如)可能更简单

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

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

然后,这可能会生成一个名为b_u0的方法。在普通的C语言中,您无法引用它,因为C标识符不能包含,但它是有效的IL。

Marcin用using语句为您在这里讨论的特定转换确定了它。但是,您还应该了解像和这样的工具,还有很多

Reflector和dotPeek将把您的代码从编译后的代码反编译回C,并进行各种级别的优化,以尝试进行C编译器的转换,基本上,它们还允许您查看IL-这也是ildasm提供给您的

IL为您提供了关于编译代码的最终答案,但是经常查看反编译代码(尤其是在关闭优化的情况下),或者将反编译器设置为提供C2代码(例如)可能更简单

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

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

然后,这可能会生成一个名为b_u0的方法。你不能在普通C中引用它,因为C标识符不能包含但它是有效的IL。

清除并感谢这一行,你不能在普通C中引用它,因为C标识符不能包含<或>,但它是有效的中间语言。.清除并感谢这一行,你不能在普通C中引用它作为C标识符不能包含<或>,但它是有效的中间语言..我以前在Reflector免费时使用它,但自从Reflector开始收费后,我一直在使用ILSpy。我的一些大学喜欢dotPeek,但我没有使用它。我曾经在它免费的时候使用Reflector,但自从Ref
莱克托开始收费。我的一些学院喜欢dotPeek,但我没有使用它。如果您对某些框架类的实际实现方式感兴趣,Microsoft已经提供了源代码。如果您对某些框架类的实际实现方式感兴趣,Microsoft已经提供了源代码。