VB.NET - 传递要在函数中使用的表达式

Posted

技术标签:

【中文标题】VB.NET - 传递要在函数中使用的表达式【英文标题】:VB.NET - Passing expression to be used within a function 【发布时间】:2022-01-09 22:49:08 【问题描述】:

我的程序的一部分由一系列步骤组成,这些步骤要么完成,要么在一定时间间隔后超时。测试条件差异很大。如何编写一个函数来封装所有可能性?

为此,理想情况下,我需要将必要的条件传递给要在函数进行评估的函数,而不是作为参数进行评估然后传递给函数。 p>

这是我最想要的(大大简化了):

Private Function TestCondition(<CONDITION>) as Boolean 
  ' Returns True if <CONDITION> fulfilled within 10 seconds
  Dim sw as New Diagnostics.StopWatch
  sw.Start()
  While sw.ElapsedMilliseconds < 10000
    If <CONDITION> Return True
    System.Threading.Thread.Sleep(500)
  End While
  sw.Stop()
  Return False
End Function

函数应该适用于任何返回布尔值的表达式:

TestCondition(x=5)
TestCondition(System.IO.File.Exists("myfile")

显然,上述方法不起作用,因为指定条件的结果被传递给函数,而不是条件本身。

根据其他阅读,我可以通过以下方式完成此操作:

重构我的代码 使用委托 使用 lambda 表达式

但我仍然不知道具体如何。

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以将 lambda 传递给可以不断重新评估的函数。

Private Function TestCondition(predicate As Func(Of Boolean)) As Boolean
    Dim sw As New Diagnostics.Stopwatch()
    sw.Start()
    While sw.ElapsedMilliseconds < 10000
        If predicate() Then Return True
        System.Threading.Thread.Sleep(500)
    End While
    sw.Stop()
    Return False
End Function
Dim result = TestCondition(Function() File.Exists("myfile"))

【讨论】:

谢谢,这正是我想要的!!!查找 lambda 函数和“Func”关键字让我陷入了相当大的困境。我学到了很多。再次感谢!!【参考方案2】:

基本上和djv说的一样,

''' <summary>
''' waits for a condition for a number of seconds
''' </summary>
''' <param name="PredicateFunc">Function() conditional check )</param>
''' <param name="WaitForTMInSecs">seconds to wait</param>
''' <returns>boolean</returns>
''' <remarks></remarks>
Private Function TestCondition(PredicateFunc As Func(Of Boolean),
                                Optional WaitForTMInSecs As Integer = 10) As Boolean
    Dim sw As Diagnostics.Stopwatch = Diagnostics.Stopwatch.StartNew
    Dim _wait As TimeSpan = TimeSpan.FromSeconds(WaitForTMInSecs)
    Dim rv As Boolean = PredicateFunc()
    Do While Not rv AndAlso sw.Elapsed <= _wait
        System.Threading.Thread.Sleep(500)
        rv = PredicateFunc()
    Loop
    Return rv
End Function

测试,

    Dim result As Boolean
    result = TestCondition(Function() String.Equals("foo", "bar"), 2)
    result = TestCondition(Function() String.Equals("foo", "foo"), 2)
    result = TestCondition(Function() IO.File.Exists("myfile"), 2)

【讨论】:

优雅 - 谢谢!

以上是关于VB.NET - 传递要在函数中使用的表达式的主要内容,如果未能解决你的问题,请参考以下文章

vb6中的RtlMoveMemory ByVal a,在vb.net中应如何表达?

VB.Net/C# - 在自定义函数上拆分字符串

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

使用宏删除 VB.NET 代码中的所有注释和空行的 Visual Studio 正则表达式

VB.NET - 正则表达式来搜索特定格式的标签

标准表达式中的数据类型不匹配(vb.net,访问)