Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Instrukcje najwyższego poziomu — programy bez metod
Napiwek
Dopiero zaczynasz programować oprogramowanie? Najpierw zacznij od samouczków Wprowadzenie . W tych samouczkach są używane instrukcje najwyższego poziomu, więc znasz już podstawy.
Szukasz alternatywnej Main metody? Zobacz Punkt wejścia metody Main dla jawnego podejścia metody Main.
Użyj instrukcji najwyższego poziomu dla nowych aplikacji. Korzystając z instrukcji najwyższego poziomu, można napisać kod wykonywalny bezpośrednio w katalogu głównym pliku.
Oto plik Program.cs, który jest kompletnym programem w języku C#:
Console.WriteLine("Hello World!");
Domyślnie, podczas tworzenia nowej aplikacji konsolowej za pomocą dotnet new console, używane są instrukcje najwyższego poziomu. Dobrze sprawdzają się w przypadku programów o dowolnym rozmiarze — od małych narzędzi i usługi Azure Functions po pełne aplikacje. Jeśli masz istniejącą aplikację, która używa jawnej Main metody, nie ma potrzeby jej konwertowania. Oba style są kompilowane do równoważnego kodu.
W poniższych sekcjach opisano reguły dotyczące tego, co można i których nie można robić za pomocą instrukcji najwyższego poziomu.
Reguły punktu wejścia
Aplikacja musi mieć tylko jeden punkt wejścia. Projekt może mieć tylko jeden plik z instrukcjami najwyższego poziomu, ale może mieć dowolną liczbę plików kodu źródłowego, które nie mają instrukcji najwyższego poziomu. Można jawnie napisać metodę Main , ale nie może działać jako punkt wejścia. W projekcie z instrukcjami najwyższego poziomu nie można użyć -main opcji kompilatora, aby wybrać punkt wejścia, nawet jeśli projekt ma co najmniej jedną Main metodę.
Kompilator generuje metodę służącą jako punkt wejścia programu dla projektu z instrukcjami najwyższego poziomu. Podpis metody zależy od tego, czy instrukcje najwyższego poziomu zawierają await słowo kluczowe lub instrukcję return . W poniższej tabeli przedstawiono, jak wygląda postać podpisu metody, w tabeli dla wygody użyto nazwy metody Main.
| Kod najwyższego poziomu zawiera | Podpis niejawny Main |
|---|---|
await i return |
static async Task<int> Main(string[] args) |
await |
static async Task Main(string[] args) |
return |
static int Main(string[] args) |
Nie await lub return |
static void Main(string[] args) |
Począwszy od języka C# 14, programy mogą być aplikacjami opartymi na plikach, gdzie pojedynczy plik zawiera program.
Aplikacje oparte na plikach są uruchamiane przy użyciu polecenia dotnet <file.cs>lub bezpośrednio przy użyciu nazwy pliku w systemie Unix (na przykład ./file.cs). Ta ostatnia wymaga włączenia dyrektywy #!/usr/bin/env dotnet jako pierwszego wiersza i ustawienia pozwolenia do wykonywania (chmod +x <file>).
using Dyrektywy
W przypadku pojedynczego pliku zawierającego using instrukcje najwyższego poziomu, dyrektywy muszą znajdować się na początku tego pliku, jak w poniższym przykładzie:
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;
Przestrzenie nazw i definicje typów
Instrukcje najwyższego poziomu znajdują się domyślnie w globalnej przestrzeni nazw. Plik z instrukcjami najwyższego poziomu może również zawierać przestrzenie nazw i definicje typów, ale muszą one pochodzić po instrukcjach najwyższego poziomu. Na przykład:
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
Instrukcje najwyższego poziomu mogą odwoływać się do zmiennej args w celu uzyskania dostępu do dowolnych argumentów wiersza polecenia przekazywanych do aplikacji po jej uruchomieniu. Zmienna args nigdy nie ma wartości null, ale jej Length wynosi zero, jeśli nie podano żadnych argumentów wiersza polecenia. Na przykład:
if (args.Length > 0)
{
foreach (var arg in args)
{
Console.WriteLine($"Argument={arg}");
}
}
else
{
Console.WriteLine("No arguments");
}
await i kod zakończenia
Użyj await, aby wywołać metodę asynchroniczną. Gdy kod najwyższego poziomu zawiera awaitelement , kompilator generuje punkt wejścia, który zwraca Taskwartość . Środowisko uruchomieniowe monitoruje je Task do ukończenia, utrzymując proces aktywny do momentu zakończenia wszystkich zadań asynchronicznych. Na przykład:
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");
Aby zwrócić kod zakończenia po zakończeniu aplikacji, użyj instrukcji return . Kompilator generuje punkt startowy, który zwraca Task<int>, gdy kod zawiera zarówno await, jak i return, albo int, gdy zawiera tylko return. Na przykład:
string? s = Console.ReadLine();
int returnValue = int.Parse(s ?? "-1");
return returnValue;