Las nuevas plantillas de C# generan instrucciones de nivel superior

A partir de .NET 6, los proyectos nuevos que usan la plantilla console generan código diferente al de las versiones anteriores:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

La nueva salida usa características recientes de C# que simplifican el código que necesita escribir para un programa. Tradicionalmente, la plantilla de aplicación de consola generaba el código siguiente:

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Estas dos variantes representan el mismo programa. Las dos son válidas con C# 10.0. Cuando se usa la versión más reciente, solo es necesario escribir el cuerpo del método Main. No es necesario incluir los demás elementos del programa. Tiene dos opciones para trabajar con los tutoriales existentes:

  • Use el nuevo estilo de programa y agregue nuevas instrucciones de nivel superior a medida que agrega características.
  • Convierta el nuevo estilo de programa en el estilo anterior, con una clase Program y un método Main.

Si quiere usar las plantillas anteriores, consulte la sección Uso del estilo de programa anterior.

Uso del nuevo estilo de programa

Las características que hacen que el nuevo programa sea más sencillo son las instrucciones de nivel superior, las directivas using globales y las directivas using implícitas.

Las instrucciones de nivel superior significan que el compilador genera los elementos de espacio de nombres, clase y método para el programa principal. Puede ver el código de la nueva aplicación e imaginar que contiene las instrucciones dentro del método Main generado por plantillas anteriores. Puede agregar más instrucciones al programa, del mismo modo que puede agregar más instrucciones al método Main en el estilo tradicional. Incluso puede agregar funciones. Se crean como funciones locales anidadas dentro del método Main generado.

Tanto las instrucciones de nivel superior como las directivas using implícitas simplifican el código que conforma la aplicación. Para seguir un tutorial existente, agregue las nuevas instrucciones al archivo Program.cs generado por la plantilla. Puede imaginar que las instrucciones que escribe están entre las llaves de apertura y cierre del método Main en las instrucciones del tutorial.

Si prefiere usar el formato anterior, puede copiar el código del segundo ejemplo de este artículo y continuar el tutorial como antes.

Puede obtener más información sobre las instrucciones de nivel superior en el tutorial de exploración sobre instrucciones de nivel superior.

Directivas using implícitas

Las directivas using implícitas significan que el compilador agrega automáticamente un conjunto de directivas using en función del tipo de proyecto. En el caso de las aplicaciones de consola, las siguientes directivas se incluyen de forma implícita en la aplicación:

  • using System;
  • using System.IO;
  • using System.Collections.Generic;
  • using System.Linq;
  • using System.Net.Http;
  • using System.Threading;
  • using System.Threading.Tasks;

Otros tipos de aplicación incluyen más espacios de nombres que son comunes para esos tipos de aplicación.

Si necesita directivas using que no se incluyen implícitamente, puede agregarlas al archivo .cs que contiene instrucciones de nivel superior o a otros archivos .cs. Para las directivas using que necesita en todos los archivos .cs de una aplicación, use directivas using globales.

Deshabilitación de directivas using implícitas

Si prefiere quitar este comportamiento y controlar manualmente todos los espacios de nombres del proyecto, agregue <ImplicitUsings>disable</ImplicitUsings> al archivo del proyecto.

Directivas using globales

Una directiva using global importa un espacio de nombres para toda la aplicación en lugar de un único archivo. Estas directivas globales se pueden agregar agregando un elemento <Using> al archivo de proyecto o agregando la directiva global using a un archivo de código.

También puede agregar un elemento <Using> en el archivo de proyecto para quitar una directiva using implícita específica. Por ejemplo, si la característica usings implícita está activada con <ImplicitUsings>enable</ImplicitUsings>, al agregar el siguiente elemento <Using> se quita el espacio de nombres System.Net.Http de los que se importan implícitamente:

<ItemGroup>
  <Using Remove="System.Net.Http" />
</ItemGroup>

Uso del estilo de programa anterior

Aunque una plantilla de aplicación de consola de .NET 6 generará el nuevo estilo de programas de instrucciones de nivel superior, con .NET 5 no es así. Al crear un proyecto de .NET 5, recibirá el estilo de programa anterior. Después, puede editar el archivo del proyecto para destinarlo a .NET 6.

Importante

Para crear un proyecto destinado a .NET 5 se necesitan las plantillas de .NET 5. Las plantillas de .NET 5 se pueden instalar manualmente con el comando dotnet new --install o mediante la instalación del SDK de .NET 5.

  1. Creación de un proyecto nuevo.

    dotnet new console --framework net5.0
    
  2. Abra el archivo del proyecto en un editor de texto y cambie <TargetFramework>net5.0</TargetFramework> por <TargetFramework>net6.0</TargetFramework>.

    Aquí se muestra una diferencia de archivo que ilustra los cambios:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
    -   <TargetFramework>net5.0</TargetFramework>
    +   <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  3. Paso opcional: puede seguir usando algunas de las características más recientes de .NET 6 y C# si agrega las propiedades de las directivas using implícitas y el contexto que acepta valores NULL al archivo del proyecto.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
    +   <ImplicitUsings>enable</ImplicitUsings>
    +   <Nullable>enable</Nullable>
      </PropertyGroup>
    
    </Project>
    

Uso del estilo de programa anterior en Visual Studio

Al crear un proyecto de consola en Visual Studio, se le mostrará un cuadro desplegable en el que se identifica la plataforma de destino que quiere usar. Cambie ese valor a 5.0. Una vez que se cree el proyecto, edite el archivo del proyecto para volver a cambiarlo a 6.0.

  1. Al crear un proyecto, los pasos de instalación le llevarán a la página de configuración Información adicional. En esta página, cambie la configuración de plataforma de .NET 6.0 (Compatibilidad a largo plazo) a .NET 5.0 y, después, seleccione el botón Crear.

    Selección del destino .NET Framework 5.0 en Visual Studio

  2. Una vez que se cree el proyecto, busque el panel Explorador de proyectos. Haga doble clic en el archivo del proyecto y cambie <TargetFramework>net5.0</TargetFramework> por <TargetFramework>net6.0</TargetFramework>.

    Aquí se muestra una diferencia de archivo que ilustra los cambios:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
    -   <TargetFramework>net5.0</TargetFramework>
    +   <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    

    Como alternativa, puede hacer clic con el botón derecho en el proyecto en el panel Explorador de proyectos y seleccionar Propiedades. Se abrirá una página de configuración en la que puede cambiar la plataforma de destino.

    Edición de las propiedades del proyecto de Visual Studio y establecimiento de la versión de .NET Framework.

  3. Paso opcional: puede seguir usando algunas de las características más recientes de .NET 6 y C# si agrega las propiedades de las directivas using implícitas y el contexto que acepta valores NULL al archivo del proyecto.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
    +   <ImplicitUsings>enable</ImplicitUsings>
    +   <Nullable>enable</Nullable>
      </PropertyGroup>
    
    </Project>
    

Comentarios sobre la plantilla

Las instrucciones de nivel superior son una nueva característica de NET 6. Vote a favor o en contra en el problema de GitHub 27420 para que sepamos si admite el uso de esta característica en las plantillas de proyecto.