Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Instrucciones de nivel superior: programas sin métodos
Sugerencia
¿No está familiarizado con el desarrollo de software? Comience primero con los tutoriales de introducción . Estos tutoriales usan instrucciones de nivel superior, por lo que ya estará familiarizado con los conceptos básicos.
¿Buscas la alternativa del Main método? Consulte Punto de entrada del método main para obtener el enfoque de método explícito Main .
Usa instrucciones de nivel superior para las nuevas aplicaciones. Mediante instrucciones de nivel superior, puede escribir código ejecutable directamente en la raíz de un archivo.
Este es un archivo Program.cs que es un programa de C# completo:
Console.WriteLine("Hello World!");
Al crear una nueva aplicación de consola mediante dotnet new console, usa instrucciones de nivel superior de forma predeterminada. Funcionan bien para programas de cualquier tamaño, desde pequeñas utilidades y Azure Functions hasta aplicaciones completas. Si tiene una aplicación existente que usa un método explícito Main , no es necesario convertirla. Ambos estilos se compilan en código equivalente.
En las secciones siguientes se explican las reglas de lo que puede y no puede hacer con las instrucciones de nivel superior.
Reglas de punto de entrada
Una aplicación solo debe tener un punto de entrada. Un proyecto solo puede tener un archivo con instrucciones de nivel superior, pero puede tener cualquier número de archivos de código fuente que no tengan instrucciones de nivel superior. Puede escribir explícitamente un Main método, pero no puede funcionar como punto de entrada. En un proyecto con instrucciones de nivel superior, no puede usar la -main opción del compilador para seleccionar el punto de entrada, incluso si el proyecto tiene uno o varios Main métodos.
El compilador genera un método que actúa como el punto de entrada del programa para un proyecto con instrucciones de nivel superior. La signatura del método depende de si las instrucciones de nivel superior contienen la palabra clave await o la instrucción return. En la tabla siguiente se muestra el aspecto de la firma del método, usando el nombre Main del método en la tabla para mayor comodidad.
| El código de nivel superior contiene | Signatura de Main implícita |
|---|---|
await y return |
static async Task<int> Main(string[] args) |
await |
static async Task Main(string[] args) |
return |
static int Main(string[] args) |
No await ni return |
static void Main(string[] args) |
A partir de C# 14, los programas pueden ser aplicaciones basadas en archivos, donde un único archivo contiene el programa. Ejecute las aplicaciones basadas en archivos usando el comando dotnet <file.cs> o utilizando la directiva #!/usr/bin/env dotnet como primera línea (solo shells de Unix).
Directivas using
Para el único archivo que contiene instrucciones de nivel superior, using las directivas deben aparecer primero en ese archivo, como en el ejemplo siguiente:
using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
return 0;
Espacios de nombres y definiciones de tipos
Las instrucciones de nivel superior están implícitamente en el espacio de nombres global. Un archivo con instrucciones de nivel superior también puede contener espacios de nombres y definiciones de tipos, pero deben aparecer después de las instrucciones de nivel superior. Por ejemplo:
MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();
public class MyClass
{
public static void TestMethod()
{
Console.WriteLine("Hello World!");
}
}
namespace MyNamespace
{
class MyClass
{
public static void MyMethod()
{
Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
}
}
}
args
Las instrucciones de nivel superior pueden hacer referencia a la args variable para acceder a los argumentos de línea de comandos que se pasan a la aplicación cuando se inicia. La args variable nunca nulles, pero su Length es cero si no se proporcionaron argumentos en la línea de comandos. Por ejemplo:
if (args.Length > 0)
{
foreach (var arg in args)
{
Console.WriteLine($"Argument={arg}");
}
}
else
{
Console.WriteLine("No arguments");
}
await y código de salida
Use await para llamar a un método asincrónico. Cuando el código de nivel superior contiene await, el compilador genera un punto de entrada que devuelve un Task. El tiempo de ejecución supervisa esa Task finalización, manteniendo el proceso activo hasta que finalice todo el trabajo asincrónico. Por ejemplo:
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");
Para devolver un código de salida cuando finalice la aplicación, use la return instrucción . El compilador genera un punto de entrada que devuelve Task<int> cuando el código contiene tanto await como return, o int cuando contiene solo return. Por ejemplo:
string? s = Console.ReadLine();
int returnValue = int.Parse(s ?? "-1");
return returnValue;