在堆栈中 MoveNext 的前缀是啥意思?

Posted

技术标签:

【中文标题】在堆栈中 MoveNext 的前缀是啥意思?【英文标题】:What does prefix to MoveNext mean in the stackstace?在堆栈中 MoveNext 的前缀是什么意思? 【发布时间】:2014-01-29 22:36:03 【问题描述】:

.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 代码,无关紧要。

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

d__5 表示什么?

【问题讨论】:

Linq 创建临时的IEnumerable 类来评估结果。 d__5.MoveNext 是对它创建的 IEnumerable 的迭代。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

通过定义和实例化“匿名”类,在编译器中实现了几种创建返回 IEnumerable 对象的新方法。这些类实际上需要有一个名称,因此编译器会生成一个如您所见的名称。参见例如this article 了解幕后发生的事情。

【讨论】:

以上是关于在堆栈中 MoveNext 的前缀是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

[[安装前缀] 是啥意思?

NS前缀是啥意思?

AWS ELB 中的双栈前缀是啥意思?

T-SQL 语句中的前缀 N 是啥意思,啥时候应该使用它?

MS Access SQL 查询中的这个前缀 (ABF:) 是啥意思?

ngf 前缀在 angularjs 和 ng-file-upload 中是啥意思?