Saltar al contenido

Cómo hacer funciones en línea en C#

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. Funcs devuelve valores pero Actions 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 Comparisonque 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *