net expressions examples vb.net lambda

vb.net - expressions - func vb net



¿Qué opinas sobre lambdas multilínea en VB 10 (7)

El soporte completo de métodos anónimos en VB significa que puedes comenzar a tomar un estilo más funcional con las cosas. Si el Sub () End Sub necesita ir en líneas separadas ... eso duele. Espero que permitan métodos anónimos de una sola línea, siempre que haya una sola declaración.

Estaba viendo un video en MSDN Channel 9 que se puede encontrar aquí , sobre algunas de las nuevas características en Visual Basic 10. Ahora me gusta la mayoría de las nuevas características, algunas de las cuales han sido esperadas por mucho tiempo (propiedades automáticas e inicializadores de colecciones) , uno que me llamó la atención fue el lambdas multilínea como en C #.

En el video usó un ejemplo como este:

Dim scores = {10,20,30,40,50} Dim thread as new Threading.Thread(Sub() For Each o in scores console.writeline(o) Next End Sub)

Ahora me gusta VB en toda su verbosidad, pero estoy un poco preocupado de que escribir sub ... end sub line pueda ser un poco complicado, puedo ver algún mérito en subrayar cuando estás escribiendo C # cuando solo tienes que usar algo como c => {....} y puedes cortar una gran cantidad de código.

¿Cuáles son tus posibilidades de lambdas multilínea en VB?

¿Los encontrarías útiles y dónde?


Necesitarás varias líneas una vez que obtengamos la biblioteca ParallelFX.

Por ejemplo, supongamos que quieres hacer que este ciclo sea paralelo:

For i = 0 to 100 ''12 lines of code'' Next

La versión paralela sería:

Parallel.For( 0, 100, sub(i) ''12 lines of code'' End Sub )

Funciona al convertir las agallas del bucle en un nuevo sub. Ese nuevo submarino es llamado por N hilos, normalmente N es la cantidad de núcleos disponibles.


Personalmente, creo que la sintaxis de VB para delegados y lambdas es completamente falsa. Quiero decir, vamos, ¡ AddressOf ! Esto estuvo bien en VB6. Definitivamente no está bien en un lenguaje como VB.NET donde las funciones deben ser tratadas como ciudadanos de primera clase (aunque realmente no lo son, por supuesto) y donde la conversión de grupos de métodos a delegados es más o menos transparente.

Ahora la introducción de funciones en línea es terriblemente detallada. De hecho, creo que el enfoque C # - x => f(x) le iría muy bien en VB porque muestra exactamente lo que hace. En el estado actual, prefiero C # para cualquier trabajo de programación funcional, lo cual es una pena porque generalmente estoy a favor de VB.

Ahora, realmente me alegro de que VB finalmente obtenga lambdas multilínea y lambdas de declaración porque a veces son útiles (tome el caso de Parallel.For ). Pero la sintaxis está en mal estado. Lo mismo ocurre con los iteradores, por cierto (si deben hacerlo en VB10).


De preferencia, soy un desarrollador de C #, pero he estado usando VB 9 casi exclusivamente durante aproximadamente un año. Lo # 1 de VB 9 que rompe mi corazón es el limitado lambdas. Lambdas en VB 9 están limitados de las siguientes maneras:

  • Solo una declaración.
  • Deben devolver un valor.

Por lo tanto, el método ForEach en colecciones no funcionará con lambdas, y solo las operaciones más simples funcionarán. Por lo tanto, la mayoría de las veces debe mover su lógica a algún otro método y usar AddressOf. Muchas veces esto escinde la legibilidad del código de una manera dramática y desgarradora.

Es algo que creo que muchos no entenderían a menos que hayan usado métodos anónimos con fluidez en otro idioma que los soporte por completo (C #, JavaScript, etc.), en lugar del soporte paralizado que tienen en VB 9.

Estoy extremadamente aliviado de que estén arreglando lambdas en VB 10.


Puedo pensar en dos razones por las que me encantan. He estado esperando demasiado para esto.

Primero:

Private Sub SomeMethod() Dim SomeVariable as String = "Some text." AddHandler SomeButton.Click, Sub() SomeVariable += " Some more text" MessageBox.Show(SomeVariable) End Sub

Segundo:

Private Sub SomeMethodRunningInAnotherThread() Me.Dispatcher.Invoke(Normal, Sub() ''Do some other stuff '' SomeTextBox.Text = "Test" End Sub) End Sub


Lo mismo aquí, me encanta vb. La mayoría de las veces estás pensando y sin escribir el código de todos modos, por lo que el argumento de verbosidad falla en mi opinión, ya que normalmente miras el código o lo editas e imagino el tiempo que estás ahorrando entendiendo tu código cuando lo lees en su verbosidad en vb? Mucho más fácil y menos error y propenso a errores en comparación con c #.

Además, c # todavía tiene cláusula no with, y vb lo ha tenido incluso antes de los días .net.

With obj.class.methods .property = 1 .attribute = 2 End with

Imagina esto con 10 cosas que deben establecerse? En c # tendrías que crear una referencia a obj.class.methods y utilizar eso para la expresión abreviada, que es memoria desperdiciada e ineficiente, por lo que en ese sentido vb usa menos memoria y no se te castiga por usar menos memoria a diferencia de c #.

Y el argumento de palabra clave "usar" falla, ya que el uso no funciona con la mayoría de los objetos u objetos que no implementan identificables, lo que es absolutamente molesto.

Luego, piense en todas las fundiciones explícitas que tiene que hacer en c # en lugar de vb. C # errs argumentará que se fomenta una mejor codificación, pero eso es una tontería, ya que cualquier buen desarrollador no necesita emitir explícitamente algo 500 veces al día para comprender que si no lo hiciera se realizaría un casting implícito (como lo hace en vb).

La mayoría de los c # errs lo usan porque vienen del fondo de ca, lo cual está bien, pero creo que muchos de ellos comenzaron porque contiene la letra cy piensan que es más genial porque carece de la innovación en el lenguaje que tiene vb, por lo que más difícil para el desarrollador, y eso los hace sentir más inteligentes y más frescos y por encima de todos los demás - ja, no entienden que esconder la complejidad a un costo cero es el objetivo final, que es lo que vb puede hacer por usted. Observe la parte de costo cero, ya que no sería bueno si estuviera a un costo superior a cero.