编译这样一个简单的匿名类型代码时:
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的答案可以删除属性(不可能),但我想知道"为什么?"。
答案 0 :(得分:5)
因为匿名类型实现是由编译器自动完成的,所以让调试器逐步完成自动生成的代码是没有意义的。
答案 1 :(得分:4)
这是DebuggerHiddenAttribute - 它只是告诉Visual Studio调试器这是一个生成的类型,不要在其代码中停止。 (因为代码不是由用户编写的 - 它是由编译器生成的。)
允许其他调试器遵循相同的行为 - 如果您阅读文档,则此属性没有附加语义,因此所有调试器(或虚拟机)都可以自由地解释它(或者可以自由忽略)它)。
答案 2 :(得分:0)
来自MSDN
公共语言运行库不向此属性添加语义。 它供源代码调试器使用。例如, Visual Studio 2005调试器不会停止在标有此的方法中 属性并且不允许在方法中设置断点。 Visual Studio 2005识别的其他调试器属性 debugger是DebuggerNonUserCodeAttribute和 DebuggerStepThroughAttribute。
我认为这是因为代码是在编译时生成的,而不是程序员编写的,因此用户代码中不存在生成代码的某些行,并且调试器无法显示它。