簡體   English   中英

如何在 C#/Visual Studio 中調試謂詞?

[英]How to debug Predicates in C#/Visual Studio?

在調試模式下,如果我 hover 超過一個謂詞,我看到的只是一些類型名稱和一些不可理解的符號。 這使得調試代碼變得非常困難,例如要知道某個變量所持有的謂詞。 我通常使用 lambda 表達式來分配這個謂詞值。 有什么方法可以了解謂詞包含的內容嗎?

例如,如果我有一個Predicate<object> myPred變量或一個List<Predicate<object>> predList變量,我如何調試 myPred 具有什么值或 predList 在運行時包含什么?

您可能想要Expression<Predicate<T>> 它可以轉換為Predicate<T>以便調用它,但保留有關 lambda 結構的信息。

【我沒查過C# IDE的經驗,其實是VS2010 VB.NET的經驗。】

要么按照@BenVoigt 的建議使用Expression ,要么不要為您的謂詞使用匿名 lambda:(VB.NET 回答:使用您命名的Functions並使用AddressOf運算符指定它們。)

C# 答案類似於:聲明由您命名的顯式函數,並在分配謂詞時指定 function 名稱。

這是我的測試 VB.NET 代碼,它確認至少可以成功命名一種動態創建謂詞的方法。 在 VB.NET IDE 中很容易看到這些名稱。

Module Module1

Sub Main()
    For i = 1 To 2
        'Dim p As Predicate(Of Object) = Function(o) (o Is Nothing)
        'Dim p As Predicate(Of Object) = AddressOf NamedPredicate
        Dim p As Predicate(Of Object) = GeneratePredicate(i)
        Dim q As Expressions.Expression(Of Predicate(Of Object)) = Function(o) (o IsNot Nothing)
        If p(q) Then Console.WriteLine((q.Compile)(p))
    Next
End Sub
Private Function NamedPredicate(ByVal o As Object) As Boolean
    Return (o Is Nothing)
End Function
Private Function GeneratePredicate(ByVal i As Integer) As Predicate(Of Object)

    Dim gp = New Reflection.Emit.DynamicMethod("DynPred" & i, GetType(Boolean), {GetType(Object)})
    Dim mb = gp.GetILGenerator
    mb.Emit(Reflection.Emit.OpCodes.Ldarg, 0)
    mb.Emit(Reflection.Emit.OpCodes.Ldnull)
    mb.Emit(Reflection.Emit.OpCodes.Ceq)
    If i = 2 Then
        mb.Emit(Reflection.Emit.OpCodes.Ldc_I4_0)
        mb.Emit(Reflection.Emit.OpCodes.Ceq)
    End If
    mb.Emit(Reflection.Emit.OpCodes.Ret)
    GeneratePredicate = DirectCast(gp.CreateDelegate(GetType(Predicate(Of Object))), Predicate(Of Object))
End Function
End Module

如果你的意思是在這樣的例子中

new List<int>()
.Select(i => i + 1);

您想調試 i + 1 部分,然后您可以將鼠標 cursor(插入符號)放在 i + 1 的某個位置,然后按 F9 將在該表達式中添加一個斷點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM