La plantilla de aplicación de consola de C# genera instrucciones de nivel superior

A partir de .NET 6, la plantilla de proyecto para las nuevas aplicaciones de consola de C# genera el código siguiente en el archivo Program.cs:

// 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. Para .NET 5 y las versiones anteriores, la plantilla de aplicación de consola genera el código siguiente:

using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        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. El compilador genera una Program clase con un método de punto de entrada y coloca todas las instrucciones de nivel superior en ese método. El nombre de este método no es en realidad Main, es un detalle de implementación al que el código no puede hacer referencia directamente. No es necesario incluir los demás elementos del programa; el compilador los genera automáticamente. Puede obtener más información sobre el código que genera el compilador al usar instrucciones de nivel superior en el artículo sobre instrucciones de nivel superior en la sección Aspectos básicos de la Guía de C#.

Tiene dos opciones para trabajar con tutoriales que no se han actualizado para usar plantillas de .NET 6+:

  • 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 Uso del estilo de programa anterior más adelante en este artículo.

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.

El término instrucciones de nivel superior significa que el compilador genera los elementos clase y método para el programa principal. La clase generada por el compilador y el método del punto de entrada se declaran en el espacio de nombres global. 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, pero en el espacio de nombres global.

Puede agregar más instrucciones al programa, del mismo modo que puede agregar más instrucciones al método Main en el estilo tradicional. Puede acceder a args (argumentos de la línea de comandos), usar await y establecer el código de salida. Incluso puede agregar funciones. Se crean como funciones locales anidadas dentro del método de punto de entrada generado. Las funciones locales no pueden incluir ningún modificador de acceso (por ejemplo, public o protected).

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

El término directivas using implícitas significa 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 usingglobales.

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 de proyecto en el elemento <PropertyGroup>, como se muestra en el ejemplo siguiente:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    ...
    <ImplicitUsings>disable</ImplicitUsings>
  </PropertyGroup>

</Project>

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> con un atributo Remove en el archivo de proyecto para quitar una directiva using implícita específica. Por ejemplo, si la característica de directiva using 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

A partir del SDK de .NET 6.0.300, la plantilla console incluye una opción --use-program-main. Empléela para crear un proyecto de consola que no use instrucciones de nivel superior y que tenga un método Main.

dotnet new console --use-program-main

El archivo Program.cs generado es el siguiente:

namespace MyProject;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Uso del estilo de programa anterior en Visual Studio

  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, active la casilla Do not use top-level statements (No usar instrucciones de nivel superior).

    Visual Studio do not use top-level statements check box

  2. Una vez creado el proyecto, el contenido de Program.cs es el siguiente:

    namespace MyProject;
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
    

Nota

Visual Studio conserva el valor de las opciones la siguiente vez que cree el proyecto usando la misma plantilla, con lo cual la próxima vez que cree un proyecto de aplicación de consola, la casilla "Do not use top-level statements" (No usar instrucciones de nivel superior) estará activada de forma predeterminada. El contenido del archivo Program.cs puede ser diferente del estilo de código definido en la configuración global del editor de texto de Visual Studio o en el archivo EditorConfig.

Para obtener más información, vea Creación de configuraciones de editor personalizadas y portátiles con EditorConfig y Opciones > Editor de texto > C# > Avanzado.