Funciones anónimas (Guía de programación de C#)

Actualización: noviembre 2007

Como ya se ha explicado anteriormente, un delegado es un tipo que envuelve una llamada a un método. Una instancia de delegado se puede pasar entre métodos simplemente como un tipo, y se puede invocar como un método. Una función anónima es una instrucción o expresión insertada que puede utilizarse en cualquier lugar donde se espere un tipo delegado. Puede utilizarla para inicializar un delegado con nombre o pasarla en lugar de un tipo delegado con nombre como un parámetro de método.

Existen dos tipos de funciones anónimas, que se analizan individualmente en los temas siguientes:

La evolución de delegados en C#

En C# 1.0, se creaba una instancia de un delegado inicializándolo explícitamente con un método que se definía en otra parte del código. En C# 2.0, se introdujo el concepto de métodos anónimos como un medio de escribir bloques de instrucciones insertados sin nombre que se pueden ejecutar en una invocación de delegado. C# 3.0 introduce las expresiones lambda, que son similares en concepto a los métodos anónimos, pero más expresivas y concisas. Estas dos características se conocen colectivamente como funciones anónimas. En general, las aplicaciones destinadas a la versión 3.5 y posteriores de .NET Framework deberían utilizar expresiones lambda.

El ejemplo siguiente muestra cómo ha evolucionado la creación de delegados desde C# 1.0 a C# 3.0:

class Test
{
    delegate void TestDelegate(string s);
    static void M(string s)
    {
        Console.WriteLine(s);
    }

    static void Main(string[] args)
    {
        // Original delegate syntax required 
        // initialization with a named method.
        TestDelegate testdelA = new TestDelegate(M);

        // C# 2.0: A delegate can be initialized with
        // inline code, called an "anonymous method." This
        // method takes a string as an input parameter.
        TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };

        // C# 3.0. A delegate can be initialized with
        // a lambda expression. The lambda also takes a string
        // as an input parameter (x). The type of x is inferred by the compiler.
        TestDelegate testDelC = (x) => { Console.WriteLine(x); };

        // Invoke the delegates.
        testdelA("Hello. My name is M and I write lines.");
        testDelB("That's nothing. I'm anonymous and ");
        testDelC("I'm a famous author.");

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    } 
}
/* Output:
    Hello. My name is M and I write lines.
    That's nothing. I'm anonymous and
    I'm a famous author.
    Press any key to exit.
 */

Especificación del lenguaje C#

Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.

  • 5.3.3.29 Funciones anónimas

Vea también

Conceptos

Árboles de expresiones

Referencia

Instrucciones, expresiones y operadores (Guía de programación de C#)

Delegados (Guía de programación de C#)