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:
Métodos anónimos (Guía de programación de C#)
Nota:Las expresiones lambda se pueden enlazar a árboles de expresión y también a delegados.
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. */
Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.
-
5.3.3.29 Funciones anónimas