2012-02-08 86 views
2

我有一個使用堆棧跟蹤的用戶的錯誤日誌,我不完全理解。下面是它的外觀什麼是堆棧跟蹤包括Namespace.ClassName。 <MethodName> b__f是什麼意思?

Stack Trace: 
    at ...Presenters.Forms.PresenterHome.<GetCounts>b__f(IActivityItem activityItem) 
    at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source, Func`2 predicate) 
    at ...Presenters.Forms.PresenterHome.GetCounts(Int32& completeCount, Int32& incompleteCount) 
    at ...Presenters.Forms.PresenterHome.UpdateSummaryPanel() 
    ..... 

(我已刪除了部分命名空間的開始,以保​​護客戶的身份)

的一部分,我不明白的是<GetCounts>b__f(...)以及爲何Enumerable.Count[...](...)後調用。我認爲這與謂詞有關,但我不能完全解釋這一點。

如果它有助於例外是InvalidCastException。以下是一些涉及的代碼(稍加修改以保護身份)。

void UpdateSummaryPanel() 
{ 
    int completeCount; 
    int incompleteCount; 
    GetCounts(out completeCount, out incompleteCount); 
    ... 
} 

private void GetCounts(
    out int completeCount, 
    out int incompleteCount) 
{ 
    incompleteCount = _applicationContext.ActivityItems.Count(
     activityItem => activityItem.ActivityType == ActivityTypes.Foo 
         && ((FooActivity) activityItem).Status != CaptureStatus.Bar); 

    // similar code for other count 
} 

對於什麼是值得我敢肯定,我知道(在壞的演員陣容IE)是什麼引起的錯誤。但我真的很好奇的是,<GetCounts>b__f(...)成員在堆棧跟蹤。

+0

看起來像自動生成的代碼。典型的來源是lambdas,'yield'-iterators和C#5的'async'-方法。在你的情況下,它顯然是lambda。 – CodesInChaos 2012-02-08 20:37:45

回答

4

如果你打開你的組件,反射器,dotPeek等,你會看到,編譯器已經把邏輯的lambda表達式中GetCounts成另一種方法 - 在這種情況下<GetCounts>b__f。這對於lambda表達式和匿名方法是完全正常的 - 還有一些其他C#特性(迭代器塊,匿名類型,自動實現的方法等)也會自動爲您創建成員。

名稱中的尖括號是編譯器生成的一個很好的指示:編譯器使用一個難以形容的名字 - 一個不是有效的標識符 - 以確保不僅不會存在與您的其他成員發生任何衝突,但您也永遠無法在代碼中引用這些「隱藏」成員。

+0

謝謝Jon! (愛你的書,特別是你的F#與托馬斯佩特里切克) – 2012-02-08 20:43:16

+0

@MartinDoms:我真的很尷尬,我真的不知道F# - 托馬斯做了幾乎所有的工作:) – 2012-02-08 20:54:53

+0

我精神上忽略了異步/等待關鍵字起初爲什麼我沒有看到我的錯誤爲ClassName.MethodName()。相反,我看到ClassName。 d__123.MoveNext()。我意識到如果你的代碼使用async/await方法,編譯器必須自動生成包裝器代碼來支持該功能。所以它是有道理的。 – Brock 2016-03-22 13:40:00

1

這意味着它是編譯器生成的東西,在這種情況下是一個匿名代理。更具體地說,編譯器正在爲您的類型生成名爲<GetCounts>b__f的方法。

+0

謝謝幫助了很多人。 – 2012-02-08 20:43:58