Autor en Google+
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, 7 de junio de 2022
Compartir:
.NET

Las top level statements o instrucciones de nivel superior de C# 9 introdujeron una alternativa muy concisa para implementar los entry points de nuestras aplicaciones. De hecho, en .NET 6 fueron introducidas como la opción por defecto en las plantillas, por lo que, de alguna forma, se nos estaba forzando a utilizarlas en todos los nuevos proyectos.

Y como casi siempre sucede, rápidamente aparecieron numerosos desarrolladores a los que este cambio no les había hecho nada de gracia, y se manifestaron claramente en contra de que esta fuera la opción por defecto. La decisión por parte de los equipos de Visual Studio y .NET, que ya podemos ver si tenemos las últimas actualizaciones instaladas, es dejar que cada desarrollador decida la opción que más le guste.

Visual Studio 2022, siempre que esté actualizado con las últimas revisiones, permite que a la hora de crear un nuevo proyecto .NET seleccionemos la opción Do not use top level statements si queremos volver a ver un Program.cs a la vieja usanza:

Check para no usar top level statements en el cuadro de diálogo de creación de proyectos

Si no usamos Visual Studio y somos más de línea de comandos,  también es posible conseguirlo desde la CLI de .NET gracias al switch --use-program-main del comando dotnet new:

C:\Test>dotnet new console --use-program-main
La plantilla "Aplicación de consola" se creó correctamente.

Procesando acciones posteriores a la creación...
Ejecutando "dotnet restore" en C:\Test\test.csproj...
  Determinando los proyectos que se van a restaurar...
  Se ha restaurado C:\Test\test.csproj (en 86 ms).
Restauración realizada correctamente.

C:\Test>type program.cs
namespace test;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Ojo, tened en cuenta que esta opción sólo se aplica al uso de top level statements, y no a otras novedades como implicit o global usings, nullables, minimal API o minimal hosting. Por ejemplo, una aplicación ASP.NET Core creada con este check incluirá un Program.cs con la clase Program y su típico método Main(), pero seguirá usando la configuración de host y aplicación compacta (sin clase Startup).

Personalmente, no creo que vaya a marcar nunca este check box. Por supuesto, creo que las top level statements tienen cosas negativas, por ejemplo:

  • La inconsistencia a nivel de lenguaje respecto al resto de elementos que componen una aplicación. Aquí aquí no hay clases ni métodos, sólo código, y eso puede despistar un poco al principio o al que esté empezando con C# con la idea preconcebida de que es un lenguaje totalmente orientado a objetos.
  • La "magia" que hay por detrás de algunas características, como la recepción de argumentos -el típico parámetro args- o el código autogenerado al compilar.
  • Y, quizás para mí lo más importante, el impacto que tiene en documentación, vídeos, posts y todo tipo de contenido, dejando obsoletos o sin aplicabilidad muchos de ellos.

Sin embargo, es indudable que las top level statements son fantásticas para presentaciones, charlas, formación o cualquier otra forma de difusión de información o conocimientos, porque permiten simplificar el código de arranque para poder centrarnos en lo importante. También, creo que pueden hacer más amigables los primeros pasos con .NET y favorecer el acercamiento de desarrolladores de otras tecnologías, porque la barrera de entrada la deja casi a ras de suelo.

Y vaya, fuera de estos escenarios tampoco creo que me molesten mucho, así que de momento optaré por continuar utilizándolas.

Publicado en Variable not found.

Compartir:

Aún no hay comentarios, ¡sé el primero!

Artículos relacionados: