El modificador in para parámetros de entrada

“… Someone’s knocking at the door
Somebody’s ringing the bell
Do me a favor, open the door, and let ‘em in…”
Paul McCartney and Wings, “Let ‘Em In” (1976)

Aunque ya todos estamos esperando la presentación oficial de Visual Studio 2019 y C# 8.0 el próximo martes, yo aún sigo descubriendo algunas de las novedades del lenguaje que fueron incluidas en las tres releases puntuales que se liberaron bajo la etiqueta 7.x. En particular, hoy quiero referirme al modificador in, que ahora se puede asociar a los parámetros de un método de manera similar a como se utilizan ref y out en C# desde el principio de los tiempos.

Básicamente, cuando un parámetro se declara in, el compilador impedirá que dicho parámetro pueda modificarse dentro del cuerpo del método. Se trata de un paso pequeño, pero importante, en la dirección de la especificación declarativa de las propiedades de los métodos, principalmente útil en el caso de los parámetros que son clases (y por tanto se pasan por referencia) y podrían modificarse de manera inadvertida. Por otra parte, el hecho de que el parámetro no va a ser modificado hace en principio irrelevante si éste es pasado por valor o por referencia; esto, a su vez, hace posible la generación del código más eficiente posible en el lugar de las llamadas. Éste es el escenario de mayor relevancia en relación con el rendimiento, específicamente en el caso de los parámetros de tipo struct (que son tipos-valor) cuyo tamaño en memoria exceda el tamaño de la palabra del ordenador. En tales casos, el compilador generará código para pasar el parámetro por referencia y no por valor, con el consiguiente ahorro en la copia de datos en la pila. Un ejemplo podría ser el siguiente:

        // Computes the distance from a to b.
        public static double GetDistance(
            in System.Drawing.Point a, 
            in System.Drawing.Point b) 
        { 
            int dx = a.X - b.X; 
            int dy = a.Y - b.Y; 
            return System.Math.Sqrt(dx*dx + dy*dy); 
        }

Este ejemplo me trae a la mente una demo gráfica que solía hacer Microsoft por allá por el año 2000 cuando .NET estaba naciendo. La idea subyacente era que en .NET System.Drawing.Point es una estructura, mientras que en Java (el rival a batir por aquella época) el tipo correspondiente es (o era, no sé si la cosa habrá cambiado con el tiempo) una clase; un algoritmo que tenga que generar dinámicamente muchos puntos será bastante más lento en el segundo caso, debido a la necesidad de gestionar la creación en el heap de numerosos objetos. El uso del nuevo modificador in de C# 7.2 habría contribuido en aquel momento a hacer aún mayor la ventaja.

Personalmente, la inclusión del modificador in en el lenguaje me agrada mucho porque de alguna manera completa la transición de C# de un lenguaje más primitivo en el que los parámetros se denotan pensando en cómo los argumentos correspondientes serán pasados en tiempo de ejecución (por valor o por referencia), como ocurría en lenguajes históricos como C o Pascal, en un lenguaje más moderno y declarativo en el que los parámetros se denotan pensando en su propósito (de entrada, salida o entrada/salida), dejando al compilador los detalles de cómo implementar las llamadas de la manera más eficiente. Ada fue probablemente el lenguaje en el que esta idea se presentó claramente por primera vez.

El uso del modificador in se me antoja imprescindible cuando se esté creando una nueva aplicación o librería; como ocurre con casi todas las características que han sido incluidas después de la concepción original del lenguaje (lo que en inglés se diría un afterthought), debe utilizarse con cierta precaución al incorporarla en proyectos existentes; consulte los documentos de Microsoft al respecto (como éste) para más información.


Referencia musical: “Let ‘Em In” fue el segundo single del quinto disco de Paul McCartney con la banda Wings (“Wings at the Speed of Sound“, 1976). Sonó bastante por la radio, aunque no tanto como “Silly Love Songs“, que fue el número 1 de la lista Billboard de ese año.

Octavio Hernandez

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

Deja un comentario

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