2010-09-13 16 views
6

Widzę wzorzec w całym kodzie, w którym wyrażenie lambda pokazuje, że nie jest objęte pokryciem kodu, debugger przechodzi przez kod i nie ma bloków warunkowych.Pokrycie kodu na wyrażeń 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(); 
} 

To jest trochę dziwne. Jakieś pomysły?

Odpowiedz

5

Myślę, że chodzi o to, że debugger nie przekracza wskazanej linii; czy to prawda?

Jeśli to jest twoje pytanie, to odpowiedź brzmi, że przynajmniej w tym szczególnym przypadku, to, co widzisz, to odroczona egzekucja. Wszystkie metody rozszerzenia LINQ dostarczone przez System.Linq.Enumerable wykazują takie zachowanie: mianowicie, kod wewnątrz samej instrukcji lambda jest nie wykonany na linii, w której ją definiujesz. Kod jest wykonywany tylko po wyliczeniu wynikowego obiektu.

Dodaj to pod kodem Wysłany:

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

Tutaj widać skok debugger powrotem do lambda.

+0

+1. Alternatywnie, używa on 'ToList' zamiast' AsEnumerable' i ma taki sam efekt. – Niki

+1

@nikie: Tak, ale chciałem, aby on właśnie zobaczył, jak debugger wraca do lambda po iteracji, ponieważ wydaje mi się, że czyni to bezbłędnie jasne, co się dzieje. –

+2

Należy również zauważyć, że jeśli kolekcja jest pusta, rzutowanie nigdy nie zostanie wywołane, nawet jeśli kolekcja jest iterowana. –