更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
エディション |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
![]() |
Standard |
![]() |
![]() |
![]() |
![]() |
Pro/Team |
![]() |
![]() |
![]() |
![]() |
表の凡例 :
![]() |
対象 |
![]() |
該当なし |
![]() |
既定で非表示のコマンド |
LINQ コードをデバッグする場合には、ステップ実行に動作上の違いがいくつかあるため、注意が必要です。
LINQ to SQL
LINQ to SQL クエリでは、述語コードがデバッガによる処理の対象外となります。そのため、述語コードにステップ インすることはできません。式ツリーにコンパイルされるクエリは、デバッガによる処理の対象とならないコードを生成します。
Visual Basic でのステップ実行
Visual Basic プログラムをステップ実行し、デバッガがクエリ宣言を検出すると、デバッガはその宣言にはステップ インせず、宣言全体を 1 つのステートメントとして強調表示します。この動作が発生するのは、クエリが呼び出されるまで評価されないためです。詳細については、「Visual Basic における LINQ の概要」を参照してください。
次のようなコードをステップ実行すると、クエリを作成するクエリ宣言が 1 つのステートメントとして強調表示されます。
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 を呼び出します。デバッガ ウィンドウで各項目が指定された条件を満たすかどうかを確認し、IsEven 内のコードをステップ実行できます。この例の述語コードはきわめて単純です。もっと複雑な述語コードをデバッグする場合にも、この方法が十分役に立つことがあります。