2010-09-13 78 views
6

我看到了一個模式,其中的lambda表達式顯示爲未在代碼覆蓋範圍內顯示,調試器會執行代碼並且沒有條件模塊。Lambda表達式上的代碼覆蓋

public CollectionModel() 
{ 
    List<Language> languages = LanguageService.GetLanguages(); 
    this.LanguageListItems = 
     languages.Select(
      s => 
      new SelectListItem { Text = s.Name, Value = s.LanguageCode, Selected = false }). // <-- this shows as not covered 
      AsEnumerable(); 
} 

這有點奇怪。有任何想法嗎?

回答

5

我認爲你的意思是調試器沒有跨越指定的行;是對的嗎?

如果這是你的問題,那麼答案是,至少在這種情況下,你看到的是延期執行。所有由System.Linq.Enumerable提供的LINQ擴展方法都表現出這種行爲:即,lambda表達式本身中的代碼是而不是在您定義它的行上執行。該代碼僅在枚舉結果對象後執行。

添加這個你已經發布的代碼下面:

foreach (var x in this.LanguageListItems) 
{ 
    var local = x; 
} 

在這裏,你會看到調試器跳回到你的拉姆達。

+0

+1。或者,他可以使用'ToList'而不是'AsEnumerable'並且具有相同的效果。 – Niki 2010-09-13 14:43:38

+1

@nikie:是的,但我希望他專門看到調試器在迭代時跳回到lambda表達式,因爲我覺得這樣可以清楚地知道發生了什麼。 – 2010-09-13 14:46:31

+2

還要注意,如果集合爲空,那麼即使迭代集合也不會調用投影。 – 2010-09-13 17:33:25