最上層陳述式 - 不含 Main 方法的程式

您不需要在主控台應用程式專案中明確包含 Main 方法。 相反地,您可以使用最上層陳述式 功能,將您必須撰寫的程式碼降到最低。

最上層陳述式可讓您直接在檔案的根目錄撰寫可執行程式碼,進而不需要將您的程式碼包裝在類別或方法中。 這表示,您可以在沒有 Program 類別和 Main 方法的形式下建立程式。 在這種情況下,編譯器會為應用程式產生一個 Program 類別和進入點方法。 產生的方法名稱不是 Main,這是程式碼無法直接參考的實作詳細資料。

以下是一個在 C# 10 中為完整的 C# 程式的 Program.cs 檔案:

Console.WriteLine("Hello World!");

最上層陳述式可讓您為小型公用程式 (例如 Azure Functions 和 GitHub Actions) 撰寫簡單的程式。 它們也可讓新的 C# 程式設計人員更容易地開始學習及撰寫程式碼。

下列各節說明有關您可以使用最上層陳述式來做什麼和不能做什麼的規則。

僅限一個最上層檔案

應用程式必須只有一個進入點。 一個專案只能有一個具有最上層陳述式的檔案。 將數個最上層陳述式放在一個專案中的多個檔案中會導致下列的編譯器錯誤:

CS8802 只有一個編譯單元可以擁有最上層陳述式。

一個專案可以有任意數目的額外原始程式碼檔案,而這些檔案沒有最上層陳述式。

沒有其他進入點

您可以明確地撰寫一個 Main 方法,但它不能作為進入點來運作。 編譯器會發出下列警告:

CS7022 程式的進入點是全域程式碼;將忽略 'Main()' 進入點。

在一個具有最上層陳述式的專案中,您無法使用 -main 編譯器選項來選取進入點,即使該專案有一或多個 Main 方法也一樣。

using 指示詞

如果您包含了 using 指示詞,它們必須放在檔案的最前面,如下列範例所示:

using System.Text;

StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");

// Display the command line arguments using the args variable.
foreach (var arg in args)
{
    builder.AppendLine($"Argument={arg}");
}

Console.WriteLine(builder.ToString());

// Return a success code.
return 0;

全域命名空間

最上層陳述式會隱含地位於全域命名空間中。

命名空間和類型定義

具有最上層陳述式的檔案也可以包含命名空間和類型定義,但它們必須位於最上層陳述式之後。 例如:

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

最上層陳述式可以參考 args 變數,以存取任何輸入的命令列引數。 args 變數永遠不會為 null,但如果沒有提供命令列引數,則其 Length 為零。 例如:

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

await

您可以使用 await 來呼叫非同步方法。 例如:

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

處理程序的結束碼

若要在應用程式結束時傳回 int 值,可以使用 return 陳述式,就像在傳回 intMain 方法中一樣。 例如:

string? s = Console.ReadLine();

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

隱含進入點方法

對於含有最上層陳述式的專案,編譯器會產生一個方法作為程式的進入點。 該方法的簽名取決於最上層陳述式是否包含 await 關鍵字或 return 陳述式。 下表顯示方法簽名的寫法 (在表中使用方法名稱 Main 以便查閱)。

最上層程式碼包含 隱含 Main 簽名
awaitreturn static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
沒有 awaitreturn static void Main(string[] args)

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。 語言規格是 C# 語法及用法的限定來源。

功能規格 - 最上層陳述式