逐步執行和 LINQ
這個主題適用於:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro、Premium 和 Ultimate |
偵錯 LINQ 程式碼時,您應該注意到逐步執行的有些行為差異。
LINQ to SQL
在 LINQ to SQL 查詢中,偵錯工具無法控制述詞 (Predicate) 程式碼。 因此,您無法逐步執行述詞程式碼。 任何編譯成運算式樹狀架構的查詢所造成的程式碼,都無法由偵錯工具控制。
Visual Basic 中的逐步執行
在 Visual Basic 程式中逐步執行且偵錯工具遇到查詢宣告時,並不會逐步執行該宣告,而會將整個宣告反白顯示為單一陳述式。 這種行為的發生,是因為查詢是等到被呼叫時才會評估的 如需詳細資訊,請參閱 Visual Basic 中的 LINQ 簡介。
如果逐步執行下列範例程式碼,偵錯工具會將查詢宣告或查詢建立反白顯示為單一陳述式。
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
再度逐步執行時,偵錯工具會反白顯示 For Each cur In x。 下一個逐步執行動作中,會進入函式 MyFunction。 逐步執行完 MyFunction 後,會跳回 Console.WriteLine(cur.ToSting())。 沒有任何一點會讓偵錯工具逐步執行查詢宣告中的述詞程式碼,雖然偵錯工具確實會評估該程式碼。
使用函式取代述詞以啟用逐步執行 (Visual Basic)
如果基於偵錯目的而必須逐步執行述詞程式碼,您可以藉由呼叫包含原始述詞程式碼的函式來取代述詞。 例如,假設您有下段程式碼:
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
您可以將述詞程式碼移到新的函式,名為 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
修訂的查詢每回會透過 items 呼叫函式 IsEven。 您可以使用偵錯工具視窗查看每個項目是否符合指定狀況,而且可以逐步執行 IsEven 中的程式碼。 這個範例中的述詞相當簡單。 但是,當您必須偵錯更為複雜的述詞時,這個技巧就很好用。