单步执行和 LINQ
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
||||
标准版 |
||||
专业及团队版 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
调试 LINQ 代码时,单步执行具有一些您应该知道的行为差异。
LINQ to SQL
在 LINQ to SQL 查询中,谓词代码不受调试器控制。因此,无法进入并单步执行谓词代码。任何编译为表达式树的查询都会产生不受调试器控制的代码。
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 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。您可以使用调试器窗口来查看每个“item”是否满足指定条件,并且可以单步执行 IsEven 中的代码。此示例中的谓词相当简单。但是,如果必须调试一个更复杂的谓词,这种技术也会十分有用。