MoveNext 的前缀在堆栈中是什么意思



.NET 应用程序崩溃并出现堆栈跟踪:

调用堆栈:

Layouts!Layouts.Ribbon.SizeAndPositionControlViewModel+OnLayoutSelectionChanged>d__5.MoveNext() 
mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(System.Object)
WindowsBase_ni!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) 

调用堆栈的其余部分是 Windows 代码,无关紧要。

以下是第一个调用的含义:在异步方法OnLayoutSelectionChanged()SizeAndPositionControlViewModel 的实例中,它在方法 MoveNext() 中失败。 MoveNext()恰好是 LINQ 方法方法Any中的Microsoft代码。

d__5意味着什么?

d__5 部分是由 C# 编译器生成的前缀,用于使构造与其他生成的成员/类型保持唯一。 在这种情况下,d前缀意味着它是一个迭代器或异步方法生成的类(d用于两者)。 对于生成的每个名称,该数字只是递增

这些是由编译器自动生成的lambda表达式的名称(匿名方法在调试时可能看起来也类似)。

创建返回的 IEnumerable 对象的几种较新方法是通过定义和实例化"匿名"类在编译器中实现的。 这些类实际上需要一个名称,因此编译器会生成一个名称,就像您所看到的一样。 例如,请参阅本文以了解幕后发生的事情。

最新更新