es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

VB.NET: Pasar una expresión para ser utilizada dentro de una función

Parte de mi programa consiste en una serie de pasos que se completan o se agotan después de cierto intervalo de tiempo. Las condiciones de prueba varían ampliamente. ¿Cómo puedo escribir una sola función para encapsular todas las posibilidades?

Para hacer eso, idealmente necesitaría pasar la condición necesaria a la función para que se evalúe dentro de la función, en lugar de evaluarse como un parámetro y luego pasarla a la función.

Esto es lo que idealmente querría (simplificado en gran medida):

Función Privada TestCondition(<CONDICIÓN>) como Boolean 
  ' Retorna Verdadero si <CONDICIÓN> se cumple dentro de 10 segundos
  Dim sw as New Diagnostics.StopWatch
  sw.Start()
  Mientras sw.ElapsedMilliseconds < 10000
    Si <CONDICIÓN> Entonces Return True
    System.Threading.Thread.Sleep(500)
  Fin Mientras
  sw.Stop()
  Return False
Fin Función

La función debería funcionar con cualquier expresión que devuelva un valor booleano:

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

Obviamente, lo anterior no funciona ya que se pasan los resultados de las condiciones especificadas a la función, en lugar de las condiciones en sí.

Basado en otras lecturas, probablemente pueda lograr esto mediante:
– Reestructurar mi código
– Usar delegados
– Usar expresiones lambda

Pero todavía no veo exactamente cómo.

¡Muchas gracias por tu ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para encapsular todas las posibilidades, puedes utilizar expresiones lambda que te permitirán pasar la condición necesaria a la función para ser evaluada dentro de la propia función. Aquí tienes un ejemplo de cómo podrías lograrlo:

    “`vb.net
    Private Function TestCondition(condition As Func(Of Boolean)) As Boolean
    Dim sw As New Stopwatch
    sw.Start()

    While sw.ElapsedMilliseconds < 10000
        If condition() Then
            Return True
        End If
        Thread.Sleep(500)
    End While
    
    sw.Stop()
    Return False
    

    End Function

    Con la función anterior, puedes pasar cualquier condición que devuelva un valor booleano utilizando una expresión lambda de la siguiente manera:
    
    ```vb.net
    Dim result = TestCondition(Function() x = 5)
    Dim fileExists = TestCondition(Function() File.Exists("myfile"))
    

    Como puedes ver, estás pasando una lambda que esencialmente devuelve un booleano cuando se evalúa, y la función TestCondition evalúa esa lambda cada medio segundo hasta que la condición sea verdadera o se acabe el tiempo.

Comments are closed.