Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 28 de diciembre de 2021
NET

Hace ya mucho tiempo que C# inició un interesante camino para conseguir reducir la cantidad de código necesario para hacer cosas frecuentes, introduciendo la capacidad de hacer implícitas determinadas construcciones y, por tanto, ahorrándonos tiempo y pulsaciones de teclas innecesarias.

En esta línea, todos recordaréis el tipado implícito, que tanto debate abrió en el lanzamiento de C# 3, hace ya casi quince años:

// Antes de C# 3
List<string> strings = new List<string>();

// Usando tipado implícito
var strings = new List<string>();

Bastante tiempo después, ya con C# 10, el lenguaje nos regaló una nueva característica que iba en la misma dirección, las expresiones new con el tipo destino. Éstas permitían construir objetos usando tipado implícito, aunque esta vez en el lado derecho de las expresiones:

// Antes de C# 10
public class MyClass
{
    private Invoice invoice = new Invoice(123);
    private Dictionary<string, Person> people = new Dictionary<string, Person>();
    ...
}

// Ahora
public class MyClass
{
    private Invoice invoice = new (123);
    private Dictionary<string, Person> people = new ();
    ...
}

También en C# 10 nos hemos encontrado con los using globales y using implícitos, características ambas que nos permiten economizar esfuerzos evitando la introducción repetitiva de directivas para la importación de namespaces en el código.

Pues bien, aquí viene la siguiente vuelta de tuerca :) Unas semanas atrás, Immo Landwerth (Program manager de .NET en Microsoft) sorprendía a todos con esta afirmación sobre una de las características principales del próximo C# 11:

Immo Landwerth announcing implicit dots

En otras palabras, la mayoría de los puntos que usamos al escribir en C# serán implícitos, por lo que no será necesario introducirlos:

// Antes de C# 11
Console.WriteLine(person.FirstName);

// En C# 11
Console WriteLine(person FirstName);

Como podéis ver, el resultado es espectacularmente legible. Tras ver código escrito de esta forma, sólo puedo pensar cómo hemos podido vivir hasta el momento salpicando nuestro código con puntos, en tantos y tantos lenguajes. Realmente, es la característica que faltaba a C# para convertirlo definitivamente en el lenguaje de referencia para el resto de la industria.

Varios son los motivos que han llevado a plantear la introducción de implicit dots en el lenguaje:

  • Analizando datos de GitHub, observaron que entre un 3 y un 5% del tamaño de los archivos se debe a los puntos. Por tanto, eliminándolos de la ecuación se obtiene un interesante ahorro energético en servidores y almacenamiento. Este porcentaje, aunque parezca pequeño, supone un ahorro inmenso cuando lo llevamos a grandes escalas (miles de proyectos con miles de archivos).
  • El mismo porcentaje de tiempo y proceso consumen los parsers al compilar los proyectos, que se evitarían gracias a esta
  • Por su posición en la zona inferior del teclado y su continua utilización, se estima que el punto es responsable de hasta el 15% de lesiones neurálgicas y tendinopatías de los profesionales del software, generando pérdidas mundiales de billones de dólares al año. De hecho, según la Asociación Nacional de Afectados de Tendinitis de EEUU, el número de lesiones tendinosas relacionadas con el dedo corazón en el gremio de desarrolladores de software descendería en un 20%.
  • Sumando las décimas de segundo que se tarda en pulsarlo, se estima que en una jornada de trabajo media se ahorrarían unos 15 minutos. De nuevo, llevado a la escala apropiada, podemos ver que una empresa con 30 trabajadores pierde cada día 8 horas de producción (vaya, una persona). 
  • Y, por qué no decirlo, el código queda más bonito, sin ese efecto de salpicaduras o manchitas que aporta ese signo de puntuación.

Esta corriente anti-puntos llegaría a entrar de tal forma en el ecosistema que incluso se está planteando cambiar el nombre de la plataforma, pasando de denominarse .NET a simplemente NET (de nuevo, el punto implícito), mucho más pronunciable, fácil de deletrear y escribir.

Por último, es interesante comentar que esta característica de momento es opcional, aunque estará activa por defecto en los nuevos proyectos C#. Para deshabilitarla, será necesario introducir el siguiente código en el archivo .csproj:

<PropertyGroup>
    <ImplicitDots>disable</ImplicitDots>
</propertyGroup>

Pero eso sí, en cualquiera de los casos, quedarían fuera de esta nueva característica los puntos decimales, que obviamente seguirán siendo obligatorios:

double d1 = 1 2; // Error CS2166: Expected double value
double d2 = 1.2; // Ok. Es obligatorio usar el punto decimal

En el resto de escenarios, como los accesos a propiedades o métodos, definiciones de rangos, namespaces, etc. podrán ser omitidos.

Personalmente, me encanta esta característica. No veo el momento de poder escribir un código como el siguiente y liberarnos para siempre del punto, ese molesto compañero de viaje:

namespace MyApp Invoicing;
...
if(invoice Customer Email EndsWith ("@gmail.com"))
{
    Console WriteLine ($"Customer {invoice Customer Name} " +
                        "uses a Gmail mailbox: {invoice Customer Email} !");
}

¿Y quedará aquí la cosa?

Pues probablemente no. Está previsto que este sea el primer paso para que en C# 12 podamos hacer también implícito el punto y coma de separación de instrucciones, como en el siguiente bloque de código:

// Compilará en C# 12
namespace MyApp Test
var x = 1 var y = 2
Invoice invoice = new() { Amount = 1000 } var z = 3
Console WriteLine (x) Console WriteLine (y+z)
Console WriteLine (invoice Amount)

Aún queda mucho para C# 12 y al final esto podría cambiar, pero espero que la idea prospere: nuestra productividad, dedos y muñecas lo agradecerán :)

Publicado implícitamente en Variable Not Found

8 Comentarios:

MontyCLT dijo...

Feliz Día de los Santos Inocentes, José María, y ya de paso sea dicho, feliz Navidad.

José María Aguilar dijo...

Muchas gracias e igualmente

Y gracias por comentar

(exclamación y puntos implícitos 😀)

Juan dijo...

¡¡¡ Me lo he comido con patatas !!! :-)

Me he ido como un halcón a ver los comentarios y menos mal que el primero ya apuntaba en la dirección correcta.

¡¡¡ Felices fiestas !!!

José María Aguilar dijo...

Aaah, debería banear los primeros comentarios en esa línea, pero @MontyCLT me cae bien ;)

Felices fiestas igualmente!

MontyCLT dijo...

MontyCLT cae bien a todo el mundo ;)

Palimp dijo...

Por poco caigo, ya que lo he leído hoy :D

ferarias dijo...

Anda queeeee...
¡Feliz Navidad!

José María Aguilar dijo...

:D Felices fiestas!