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中应如何表达?
如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#