Pernyataan tingkat atas - program tanpa metode Main

Petunjuk / Saran

Baru mengembangkan perangkat lunak? Mulai dengan tutorial Memulai terlebih dahulu. Tutorial tersebut menggunakan pernyataan tingkat atas, sehingga Anda sudah terbiasa dengan dasar-dasarnya.

Mencari metode alternatif untuk Main? Lihat Titik masuk metode utama untuk pendekatan metode eksplisit Main .

Gunakan pernyataan tingkat atas untuk aplikasi baru. Dengan menggunakan pernyataan tingkat atas, Anda dapat menulis kode yang dapat dieksekusi langsung di akar file.

Berikut adalah file Program.cs yang merupakan program C# lengkap:

Console.WriteLine("Hello World!");

Saat Anda membuat aplikasi konsol baru dengan menggunakan dotnet new console, aplikasi tersebut menggunakan pernyataan tingkat atas secara default. Mereka bekerja dengan baik untuk program dengan ukuran apa pun - mulai dari utilitas kecil dan Azure Functions hingga aplikasi lengkap. Jika Anda memiliki aplikasi yang sudah ada yang menggunakan metode eksplisit Main , Anda tidak perlu mengonversinya. Kedua gaya dikompilasi ke kode yang setara.

Bagian berikut menjelaskan aturan tentang apa yang bisa dan tidak bisa Anda lakukan dengan pernyataan tingkat atas.

Aturan titik masuk

Sebuah aplikasi harus memiliki hanya satu titik masuk. Proyek hanya dapat memiliki satu file dengan pernyataan tingkat atas, tetapi dapat memiliki sejumlah file kode sumber yang tidak memiliki pernyataan tingkat atas. Anda dapat secara eksplisit menulis Main metode, tetapi tidak dapat berfungsi sebagai titik masuk. Dalam proyek dengan pernyataan tingkat atas, Anda tidak dapat menggunakan -main opsi pengkompilasi untuk memilih titik masuk, bahkan jika proyek memiliki satu atau beberapa Main metode.

Pengompilasi menghasilkan metode untuk berfungsi sebagai titik masuk program untuk proyek dengan pernyataan tingkat atas. Tanda tangan metode bergantung pada apakah pernyataan tingkat atas berisi kata kunci await atau pernyataan return. Tabel berikut ini memperlihatkan seperti apa tanda tangan metode, menggunakan nama Main metode dalam tabel untuk kenyamanan.

Kode tingkat atas berisi Main Tanda tangan implisit
await dan return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
tidak await atau return static void Main(string[] args)

Dimulai dengan C# 14, program dapat berupa aplikasi berbasis file, di mana satu file berisi program. Anda menjalankan aplikasi berbasis file dengan menggunakan perintah dotnet <file.cs>, atau langsung menggunakan nama file di Unix (misalnya, ./file.cs). Yang terakhir memerlukan termasuk direktif #!/usr/bin/env dotnet sebagai baris pertama dan mengatur izin eksekusi (chmod +x <file>).

using arahan

Untuk file tunggal yang berisi pernyataan tingkat atas, using arahan harus menjadi yang pertama dalam file tersebut, seperti dalam contoh berikut:

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;

Namespace dan definisi jenis

Pernyataan tingkat atas secara implisit berada dalam namespace global. File dengan pernyataan tingkat atas juga dapat berisi namespace dan definisi jenis, tetapi mereka harus muncul setelah pernyataan tingkat atas. Contohnya:

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

Pernyataan tingkat atas dapat merujuk pada variabel args untuk mengakses setiap argumen baris perintah yang diteruskan ke aplikasi saat mulai. Variabel args tidak pernah null, tetapi Length nol jika tidak ada argumen baris perintah yang disediakan. Contohnya:

if (args.Length > 0)
{
    foreach (var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

await dan kode keluar

Gunakan await untuk memanggil metode asinkron. Saat kode tingkat atas Anda berisi await, pengkompilasi menghasilkan titik masuk yang mengembalikan Task. Runtime memantau Task untuk memastikan penyelesaian, menjaga proses tetap berjalan sampai semua pekerjaan asinkron selesai. Contohnya:

Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

Untuk mengembalikan kode keluar saat aplikasi berakhir, gunakan return pernyataan . Pengkompilasi menghasilkan titik masuk yang mengembalikan Task<int> ketika kode Anda berisi await dan return, atau int ketika kode Anda hanya berisi return. Contohnya:

string? s = Console.ReadLine();

int returnValue = int.Parse(s ?? "-1");
return returnValue;