Esta sección fue probado por expertos para que tengas la garantía de la veracidad de esta sección.
Solución:
Sí, C# lo admite. Hay varias sintaxis disponibles.
-
Se agregaron métodos anónimos en C# 2.0:
Func
add = delegate(int x, int y) return x + y; ; Action print = delegate(int x) Console.WriteLine(x); Action helloWorld = delegate // parameters can be elided if ignored Console.WriteLine("Hello world!"); -
Las lambdas son nuevas en C# 3.0 y vienen en dos versiones.
-
Expresión lambda:
Func
add = (int x, int y) => x + y; // or... Func add = (x, y) => x + y; // types are inferred by the compiler -
Declaración lambdas:
Action
print = (int x) => Console.WriteLine(x); ; Action print = x => Console.WriteLine(x); ; // inferred types Func add = (x, y) => return x + y; ;
-
-
Las funciones locales se han introducido con C# 7.0:
int add(int x, int y) => x + y; void print(int x) Console.WriteLine(x);
Hay básicamente dos tipos diferentes para estos: Func
y Action
. Func
s devuelve valores pero Action
s no El último parámetro de tipo de un Func
es el tipo de retorno; todos los demás son los tipos de parámetros.
Hay tipos similares con diferentes nombres, pero la sintaxis para declararlos en línea es la misma. Un ejemplo de esto es Comparison
que es aproximadamente equivalente a Func
.
Func compare1 = (l,r) => 1;
Comparison compare2 = (l, r) => 1;
Comparison compare3 = compare1; // this one only works from C# 4.0 onwards
Estos se pueden invocar directamente como si fueran métodos regulares:
int x = add(23, 17); // x == 40
print(x); // outputs 40
helloWorld(x); // helloWorld has one int parameter declared: Action
// even though it does not make any use of it.
C# 7 agrega soporte para funciones locales
Aquí está el ejemplo anterior usando una función local
void Method()
string localFunction(string source)
// add your functionality here
return source ;
;
// call the inline function
localFunction("prefix");
La respuesta a su pregunta es sí y no, dependiendo de lo que quiera decir con “función en línea”. Si usa el término como se usa en el desarrollo de C ++, entonces la respuesta es no, no puede hacer eso, incluso una expresión lambda es una llamada de función. mientras es true que puede definir expresiones lambda en línea para reemplazar las declaraciones de funciones en C#, el compilador aún termina creando una función anónima.
Aquí hay un código realmente simple que usé para probar esto (VS2015):
static void Main(string[] args)
Func incr = a => a + 1;
Console.WriteLine($"P1 = incr(5)");
¿Qué genera el compilador? Usé una herramienta ingeniosa llamada ILSpy que muestra el ensamblaje IL real generado. Eche un vistazo (he omitido muchas cosas de configuración de clases)
Esta es la función Principal:
IL_001f: stloc.0
IL_0020: ldstr "P1 = 0"
IL_0025: ldloc.0
IL_0026: ldc.i4.5
IL_0027: callvirt instance !1 class [mscorlib]System.Func`2::Invoke(!0)
IL_002c: box [mscorlib]System.Int32
IL_0031: call string [mscorlib]System.String::Format(string, object)
IL_0036: call void [mscorlib]System.Console::WriteLine(string)
IL_003b: ret
¿Ves esas líneas IL_0026 y IL_0027? Esas dos instrucciones cargan el número 5 y llaman a una función. Luego formatea IL_0031 e IL_0036 e imprime el resultado.
Y aquí está la función llamada:
.method assembly hidebysig
instance int32 'b__0_0' (
int32 a
) cil managed
// Method begins at RVA 0x20ac
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4.1
IL_0002: add
IL_0003: ret
// end of method '<>c'::'b__0_0'
Es una función muy corta, pero es una función.
¿Vale la pena algún esfuerzo para optimizar? No. Tal vez si lo está llamando miles de veces por segundo, pero si el rendimiento es tan importante, entonces debería considerar llamar al código nativo escrito en C/C++ para hacer el trabajo.
En mi experiencia, la legibilidad y la facilidad de mantenimiento son casi siempre más importantes que la optimización para ganar unos microsegundos en velocidad. Use funciones para hacer que su código sea legible y para controlar el alcance de las variables y no se preocupe por el rendimiento.
“La optimización prematura es la raíz de todos los males (o al menos de la mayor parte) en la programación”. –Donald Knuth
“Un programa que no se ejecuta correctamente no necesita ejecutarse rápido” — Yo
Te invitamos a añadir valor a nuestro contenido informacional participando con tu experiencia en las explicaciones.