Debugowanie LINQ
Program Visual Studio obsługuje debugowanie kodu zapytania zintegrowanego z językiem (LINQ) z pewnymi ograniczeniami. Większość funkcji debugowania współpracuje z instrukcjami LINQ, w tym krokami, ustawianiem punktów przerwania i wyświetlaniem wyników w oknach debugera. W tym temacie opisano główne ograniczenia debugowania LINQ.
Wyświetlanie wyników LINQ
Wynik instrukcji LINQ można wyświetlić przy użyciu DataTips, okna Podgląd i okna dialogowego QuickWatch. Gdy używasz okna źródłowego, możesz wstrzymać wskaźnik w zapytaniu w oknie źródłowym i pojawi się etykietka danych. Możesz skopiować zmienną LINQ i wkleić ją do okna zegarka lub okna dialogowego QuickWatch.
W LINQ zapytanie nie jest oceniane podczas jego tworzenia lub deklarowania, ale tylko wtedy, gdy zapytanie jest używane. W związku z tym zapytanie nie ma wartości, dopóki nie zostanie ocenione. Aby uzyskać pełny opis tworzenia i oceny zapytań, zobacz Wprowadzenie do zapytań LINQ (C#) lub Pisanie pierwszego zapytania LINQ.
Aby wyświetlić wynik zapytania, debuger musi go ocenić. Ta niejawna ocena, która występuje po wyświetleniu wyniku zapytania LINQ w debugerze, ma pewne efekty, które należy wziąć pod uwagę:
Każda ocena zapytania zajmuje trochę czasu. Rozszerzanie węzła wyników zajmuje trochę czasu. W przypadku niektórych zapytań, wielokrotne ocenianie może spowodować zauważalne pogorszenie wydajności.
Ocena zapytania może spowodować skutki uboczne, które są zmianami wartości danych lub stanu programu. Nie wszystkie zapytania mają skutki uboczne. Aby określić, czy zapytanie może być bezpiecznie oceniane bez skutków ubocznych, należy zrozumieć kod implementujący zapytanie.
Krok po kroku i LINQ
Podczas debugowania kodu LINQ krokowanie ma pewne różnice behawioralne, które warto znać.
LINQ to SQL
W zapytaniach LINQ to SQL kod predykatu wykracza poza kontrolę debugera. W związku z tym nie można przejść do kodu predykatu. Każde zapytanie kompilowane w drzewie wyrażeń generuje kod, który wykracza poza kontrolę debugera.
Krok po kroku w Visual Basic
Kiedy przechodzisz krok po kroku przez program Visual Basic i debuger napotka deklarację zapytania, nie wchodzi do niej, lecz wyróżnia całą deklarację jako pojedynczą instrukcję. To zachowanie występuje, ponieważ zapytanie nie jest oceniane, dopóki nie zostanie wywołane. Aby uzyskać więcej informacji, zobacz Introduction to LINQ in Visual Basic.
Jeśli przejdziesz przez poniższy przykładowy kod, debuger wyróżni deklarację zapytania lub tworzenie zapytania jako pojedynczą instrukcję.
Function MyFunction(ByVal x As Char)
Return True
End Function
Sub Main()
'Query creation
Dim x = From it In "faoaoeua" _
Where MyFunction(it) _
Select New With {.a = it}
' Query execution
For Each cur In x
Console.WriteLine(cur.ToString())
Next
End Sub
Gdy ponownie wykonujesz krok, debugger wyróżnia For Each cur In x
. W następnym kroku wchodzi do funkcji MyFunction
. Po przejściu przez MyFunction
program przechodzi z powrotem do Console.WriteLine(cur.ToSting())
. W żadnym momencie nie przechodzi przez kod predykatu w deklaracji zapytania, chociaż debuger ocenia ten kod.
Zastępowanie predykatu funkcją w celu umożliwienia analizy krok po kroku (Visual Basic)
Jeśli musisz przejść przez kod predykatu na potrzeby debugowania, możesz zastąpić predykat wywołaniem funkcji zawierającej oryginalny kod predykatu. Załóżmy na przykład, że masz następujący kod:
Dim items() as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
' Get the even numbers
Dim query = From nextInt in items Where nextInt Mod 2 = 0 Select nextInt
For each item in query
Console.WriteLine(item)
Next
Kod predykatu można przenieść do nowej funkcji o nazwie IsEven
:
Dim items () as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
' Get the even numbers
Dim query = From nextInt in items Where IsEven(nextInt) Select nextInt
For each item in query
Console.WriteLine(item)
Next
...
Function IsEven(item As =Integer) as Boolean
Return item Mod 2 = 0
End Function
Poprawione zapytanie wywołuje funkcję IsEven
przy każdym przejściu przez items
. Możesz użyć okien debugera, aby sprawdzić, czy każdy element spełnia określony warunek, i możesz przejść przez kod w IsEven
. Predykat w tym przykładzie jest dość prosty. Jednak, jeśli masz bardziej złożony predykat do debugowania, ta technika może być bardzo przydatna.
Edytowanie i kontynuowanie nieobsługiwane w przypadku LINQ
Opcja Edytuj i kontynuuj obsługuje zmiany w zapytaniach LINQ z ograniczeniami. Aby uzyskać więcej szczegółów, zobacz EnC Supported Changes