Respuesta: ¿Qué hace este programa?

NOTA: Este post se deriva de este otro.


Bueno, ante todo la respuesta: el programa imprime una línea con el texto “01900”. Desde la primera instrucción de Main se llama al método estático mult, pasando el valor 950 para el parámetro n. Como el valor de m no se especifica, se utilizará el valor por defecto indicado en la firma del método, que es 2. Por lo tanto, el método devolverá 950 * 2 = 1900. Este valor, a su vez, se pasa como argumento (valor) del parámetro arg0 de la llamada a una de las tantas sobrecargas de Console.WriteLine. Como formato se indica “D05”, y por eso el resultado visual es el que es.


En este programa se hace uso de dos de las novedades de C# 4.0: los parámetros opcionales y los parámetros nombrados. A continuación describiremos brevemente en qué consisten dichas novedades.


a) Parámetros opcionales


Durante su charla del PDC, parece que Hejlsberg se refirió también a esta característica como “valores por defecto para argumentos”. Me hubiese gustado estar allí y ver qué dijo, pues él fue el gran detractor de esta característica allá por C# 1.0. La idea es clara, y cualquiera que conozca VB, VB.NET, C++ o Delphi (entre otros) sabe de qué estamos hablando: se asocia un valor por defecto a ciertos parámetros de un método (que deben estar situados a la extrema derecha en la declaración), y ese valor es utilizado en caso de que no se suministre explícitamente un argumento en la llamada. Por ejemplo, podríamos definir una función Suma de la siguiente forma (por supuesto, los parámetros no tienen por qué ser del mismo tipo, aunque en este ejemplo lo sean):


   int Suma(int x = 0, int y = 0, int z = 0)
   {
      return x + y + z;
   }


Las siguientes llamadas serán válidas:


   int a = Suma();  // a = 0
   int b = Suma(2);  // b = 2
   int c = Suma(2, 3);  // c = 5
   int d = Suma(2, 3, 4);  // d = 9


Pero, ¿y si quisiéramos pasar valores para x y z, manteniendo el valor por defecto para y? En otros lenguajes con (solo) parámetros opcionales, esto es imposible. En C# 4.0, podrá lograrse gracias a los parámetros nombrados.


b) Parámetros nombrados


Básicamente, se trata de poder indicar explícitamente el nombre del parámetro al que se quiere asignar un argumento en una llamada. Por ejemplo, si quisiéramos generar un número aleatorio entre 1 y 5, además de así:


   int n = rnd.Next(1, 3);  // rnd es de tipo Random


en C# 4.0 podremos hacerlo así:


   int n = rnd.Next(minValue: 1, maxValue: 3);


o también poniendo los argumentos en el orden inverso, si nos apetece. Entre las ventajas que puede aportar esta nueva característica están el aumento de la legibilidad del código, la mayor flexibilidad para colocar los argumentos y la posibilidad de combinarla con los parámetros opcionales para lograr con una mínima cantidad de código cosas que de otra forma serían más complejas de expresar. Por ejemplo, suponga que queremos llamar al método Suma de antes pasando el valor 5 para el parámetro x y 7 para el parámetro z, manteniendo el valor por defecto para y. La solución sería:


   int e = Suma(x:5, z:7);  // e = 12


Por supuesto, este post es solo una primera aproximación a estas novedades: he omitido la mayor parte de los detalles relacionados con las extensiones de la sintaxis de llamada a métodos y de las reglas de resolución de llamadas que aseguran la integración sin fisuras de estas nuevas características dentro del lenguaje.


 

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

7 comentarios en “Respuesta: ¿Qué hace este programa?

  1. Muchas gracias por la información que nos estás dando. Parece ser que está nueva versión traerá bastante novedades, que aunque no son imprescindibles si nos pueden ayudar en algún momento.

  2. Avalon,

    Yo mejor diría “otra característica que comparte con Ruby”. Lo de la inspiración no está claro. Como decía Alfredo en el otro hilo, lenguajes como Ada o C++, de principios de los 80, ya incluían estas cosas diez años antes de que Ruby apareciera.

    Slds – Octavio

  3. Octavio,

    Muy bueno el post sobre las nuevas inovaciones que trae c#4.0, me gustaria saber si trae esta nueva version un complemento extra sobre LINQ?

    Gracias
    Antonio Malaquina

  4. Hola, Antonio!

    Con diferencia, la novedad más importantes será la incroporación de Parallel LINQ (PLINQ) al lado del LINQ to Objects “normal”. En un próximo post trataré sobre el tema.

    Saludos – Octavio

Deja un comentario

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