Estoy mirando las nuevas implementaciones en C # 7.0 y me parece interesante que hayan implementado funciones locales, pero no puedo imaginar un escenario en el que se preferiría una función local sobre una expresión lambda, y cuál es la diferencia entre las dos.
Entiendo que las lambdas son anonymous
funciones, mientras que las funciones locales no lo son, pero no puedo entender un escenario del mundo real, donde la función local tiene ventajas sobre las expresiones lambda
Cualquier ejemplo sería muy apreciado. Gracias.
Respuestas:
Esto fue explicado por Mads Torgersen en C # Design Meeting Notes donde se discutieron por primera vez las funciones locales :
Para ampliarlo un poco más, las ventajas son:
Actuación.
Al crear una lambda, se debe crear un delegado, que es una asignación innecesaria en este caso. Las funciones locales son realmente solo funciones, no se necesitan delegados.
Además, las funciones locales son más eficientes con la captura de variables locales: las lambdas generalmente capturan variables en una clase, mientras que las funciones locales pueden usar una estructura (aprobada usando
ref
), que nuevamente evita una asignación.Esto también significa que llamar a las funciones locales es más barato y pueden integrarse, posiblemente aumentando aún más el rendimiento.
Las funciones locales pueden ser recursivas.
Las lambdas también pueden ser recursivas, pero requieren un código incómodo, donde primero se asigna
null
a una variable delegada y luego a la lambda. Las funciones locales pueden ser naturalmente recursivas (incluidas las recursivas recíprocas).Las funciones locales pueden ser genéricas.
Las lambdas no pueden ser genéricas, ya que deben asignarse a una variable con un tipo concreto (ese tipo puede usar variables genéricas del ámbito externo, pero eso no es lo mismo).
Las funciones locales se pueden implementar como un iterador.
Lambdas no puede usar la palabra clave
yield return
(yyield break
) para implementar laIEnumerable<T>
función de retorno. Las funciones locales pueden.Las funciones locales se ven mejor.
Esto no se menciona en la cita anterior y podría ser solo mi sesgo personal, pero creo que la sintaxis de la función normal se ve mejor que asignar una lambda a una variable delegada. Las funciones locales también son más sucintas.
Comparar:
fuente
Func<int, int, int> f = (x, y) => x + y; f(arg1:1, arg2:1);
.object
. Entonces, lambdas podría usar una estructura, pero tendría que estar encuadrada, por lo que aún tendría esa asignación adicional.Además de la excelente respuesta de svick, hay una ventaja más para las funciones locales:
se pueden definir en cualquier lugar de la función, incluso después de la
return
declaración.fuente
#region Helpers
en la parte inferior de la función, para evitar el desorden dentro de esa función y, especialmente, evitar el desorden en la clase principal.Si también se pregunta cómo probar la función local, debe verificar JustMock ya que tiene la funcionalidad para hacerlo. Aquí hay un ejemplo de clase simple que se probará:
Y así es como se ve la prueba:
Aquí hay un enlace a la documentación de JustMock .
Descargo de responsabilidad. Soy uno de los desarrolladores responsables de JustMock .
fuente
.DoNothing().OccursOnce();
y luego afirme que la llamada se realizó llamando alMock.Assert(foo);
método. Si está interesado en cómo se admiten otros escenarios, puede leer nuestro artículo de ayuda Afirmación de sucesos .Utilizo funciones en línea para evitar la presión de recolección de basura, especialmente cuando se trata de métodos de ejecución más largos. Digamos que a uno le gustaría obtener 2 años o datos de mercado para un símbolo de teletipo dado. Además, uno puede empacar mucha funcionalidad y lógica de negocios si es necesario.
lo que uno hace es abrir una conexión de socket al servidor y recorrer los datos que vinculan un evento a un evento. Uno puede pensarlo de la misma manera que se diseña una clase, solo uno no está escribiendo métodos auxiliares en todo el lugar que realmente solo funcionan para un nivel de funcionalidad. a continuación se muestra una muestra de cómo se vería esto, tenga en cuenta que estoy usando variables y los métodos "auxiliares" están debajo de finalmente. En Finalmente, elimino muy bien los controladores de eventos, si mi clase de Exchange fuera externa / inyectada, no tendría ningún controlador de eventos pendiente registrado
Puede ver las ventajas que se mencionan a continuación, aquí puede ver una implementación de muestra. Espero que ayude a explicar los beneficios.
fuente