为什么编译器会自动为匿名类型生成Debugger属性?

时间:2016-08-31 13:52:35

标签: c# compilation cil

编译这样一个简单的匿名类型代码时:

public class Test
{   
    public static void Main()
    {
        var my_anonymous = new { Name = "anonymous"};
    }
}

IL代码为每个生成的匿名类型方法都有一个Debugger属性。例如等于:

.method public hidebysig virtual instance bool 
          Equals(object 'value') cil managed
  {
    .custom instance void [mscorlib]System.Diagnostics.DebuggerHiddenAttribute::.ctor() = ( 01 00 00 00 )
  ... // rest of IL code

为什么编译器会自动生成它?我使用Microsoft(R)Visual C#编译器版本4.6.1055.0编译它,并且(如果这有任何相关性)不使用VS cmd。

注意:有this的答案可以删除属性(不可能),但我想知道"为什么?"。

3 个答案:

答案 0 :(得分:5)

因为匿名类型实现是由编译器自动完成的,所以让调试器逐步完成自动生成的代码是没有意义的。

  1. 因为生成的代码中没有错误;它将是一个编译器错误,而不是特定于您的代码的东西。
  2. 请原谅,即使有一个错误,你也可以做很少的事情,因为一旦你编译就会重写这个类。
  3. 因为每次调试时单步调试不感兴趣的代码都很烦人。

答案 1 :(得分:4)

这是DebuggerHiddenAttribute - 它只是告诉Visual Studio调试器这是一个生成的类型,不要在其代码中停止。 (因为代码不是由用户编写的 - 它是由编译器生成的。)

允许其他调试器遵循相同的行为 - 如果您阅读文档,则此属性没有附加语义,因此所有调试器(或虚拟机)都可以自由地解释它(或者可以自由忽略)它)。

答案 2 :(得分:0)

来自MSDN

  

公共语言运行库不向此属性添加语义。   它供源代码调试器使用。例如,   Visual Studio 2005调试器不会停止在标有此的方法中   属性并且不允许在方法中设置断点。   Visual Studio 2005识别的其他调试器属性   debugger是DebuggerNonUserCodeAttribute和   DebuggerStepThroughAttribute。

我认为这是因为代码是在编译时生成的,而不是程序员编写的,因此用户代码中不存在生成代码的某些行,并且调试器无法显示它。