共用方式為


C# 語言教學導覽

C# 語言是 .NET 平台最受歡迎的語言,而 .NET 平台是一種免費、跨平台、開放原始碼開發環境。 您可以在許多不同的裝置上執行 C# 程式,從物聯網 (IoT) 裝置到雲端,以及介於兩者之間的任何裝置。 您可以針對手機、桌面電腦和膝上型電腦以及伺服器撰寫應用程式。

C# 是跨平台的一般用途語言,可提升開發人員在撰寫高效能程式碼時的生產力。 隨者數百萬開發人員的採用,C# 成為最受歡迎的 .NET 語言。 C# 在生態系統和所有 .NET 工作負載中有廣泛的支援。 根據物件導向的原則,其中會納入來自其他範例的許多功能,特別是功能性程式設計。 低階功能支援高效率的案例,而免去撰寫不安全的程式碼。 大部分的 .NET 執行階段和程式庫都是以 C# 撰寫,C# 中的進展通常會讓所有 .NET 開發人員受益。

Hello World

“Hello, World” 程式通常用來介紹程式設計語言。 以下是以 C# 撰寫的:

// This line prints "Hello, World" 
Console.WriteLine("Hello, World");

開頭為 // 的行是單行註解。 C# 單行註解開頭為 //,且繼續到目前行的結尾。 C# 也支援多行註解。 多行註解開頭為 /*,結尾為 */Console 類別的 WriteLine 方法位於 System 命名空間中,會產生程序的輸出。 此類別是由標準類別程式庫提供,根據預設,在每個 C# 程式中都會自動參考此程式庫。

上述範例會使用最上層陳述式,顯示一種格式的 "Hello, World" 程式。 舊版 C# 要求您在方法中定義程式的進入點。 此格式仍然有效,且您會在許多現有的 C# 範例中看到此格式。 您也應該熟悉此格式,如下列範例所示:

using System;

class Hello
{
    static void Main()
    {
        // This line prints "Hello, World" 
        Console.WriteLine("Hello, World");
    }
}

此版本會顯示您在程式中所使用的建置組塊。 “Hello, World” 程式的開頭為 using 指示詞,會參考 System 命名空間。 命名空間提供組織 C# 程式和程式庫的階層式方法。 命名空間包含型別和其他命名空間,例如 System 命名空間包含數個型別 (如程式中參考的 Console 類別),和許多其他命名空間 (如 IOCollections)。 使用 using 指示詞參考指定的命名空間,就能以非限定的方式使用屬於該命名空間成員的型別。 因為 using 指示詞的緣故,該程式可以使用 Console.WriteLine 當作 System.Console.WriteLine 的縮寫。 在先前的範例中,已隱含包含該命名空間。

“Hello, World” 程式宣告的 Hello 類別包含單一成員,即名為 Main 的方法。 Main 方法的宣告是使用 static 修飾元來進行。 執行個體方法可以使用關鍵字 this 參考特定的封入物件執行個體,但靜態方法卻不需要參考特定物件即可運作。 依照慣例,在沒有最上層陳述式的情況下,名為 Main 的靜態方法會做為 C# 程式的進入點

這兩種進入點格式都會產生對等的程式碼。 當您使用最上層陳述式時,編譯器會合成程式進入點的包含類別和方法。

提示

本文中的範例可讓您先查看 C# 程式碼。 某些範例可能會顯示您不熟悉的 C# 元素。 當您準備好學習 C# 時,請從我們的初學者教學課程開始,或深入了解每個章節中的連結。 如果您有 JavaJavaScriptTypeScriptPython 方面的經驗,請閱讀我們的秘訣,以協助您找到快速了解 C# 所需的資訊。

熟悉的 C# 功能

C# 適用於初學者,但會針對撰寫特殊化應用程式的資深開發人員提供進階功能。 您可以快速提高生產力。 您可以在應用程式需要更特殊化的技術時,深入了解這些技術。

C# 應用程式受益於 .NET 執行階段的自動記憶體管理。 C# 應用程式也會使用 .NET SDK 所提供的大量執行階段連結庫。 某些元件與平台無關,例如檔案系統程式庫、資料收集和數學程式庫。 其他元件則專屬於單一工作負載,例如 ASP.NET Core Web 程式庫或 .NET MAUI UI 程式庫。 NuGet 上的豐富開放原始碼生態系統可增強執行階段一部分的程式庫。 這些程式庫能提供更多元件供您使用。

C# 是 C 系列語言。 如果您已使用過 C、C++、JavaScript 或 Java,則會很熟悉 C# 語法。 如同 C 系列中的所有語言,分號 (;) 定義陳述式的結尾。 C# 識別碼不區分大小寫。 C# 對於大括弧 {}ifelseswitch 等控制項陳述式,以及 forwhile 等迴圈建構有相同的用法。 C# 也具有任何集合型別的 foreach 陳述式。

C# 是強型別語言。 您宣告的每個變數都有編譯時間已知的型別。 編譯器或編輯工具會告訴您是否不正確地使用該型別。 您在執行程式之前,可以修正這些錯誤。 基本資料類型內建於語言和執行階段:實值型別 (例如 intdoublechar)、參考型別 (例如 string、陣列和其他集合)。 當您撰寫程式時,要建立自己的型別。 這些型別可為值的 struct 型別,或是定義物件導向行為的 class 型別。 您可以將 record 修飾元新增至 structclass 型別,使編譯器合成程式碼以進行相等比較。 您也可以建立 interface 定義,以定義實作該介面的型別所必須提供的合約 (或一組成員)。 您也可以定義泛型型別和方法。 泛型在使用過程中,會使用型別參數來提供實際型別的預留位置。

當您撰寫程式碼時,可以定義函式,也稱為方法,做為 structclass 型別的成員。 這些方法會定義型別的行為。 方法可以進行多載,使用不同數目或型別的參數。 方法可以選擇性地傳回值。 除了方法之外,C# 型別也可具有屬性,這些屬性是由稱為存取子的函式所支援的資料元素。 C# 型別可以定義事件,以允許型別向訂閱者通知重要動作。 C# 支援物件導向技術,例如 class 型別的繼承和多型。

C# 應用程式會使用例外狀況來報告及處理錯誤況。 如果您已使用過 C++ 或 Java,則將會很熟悉這種做法。 您的程式碼在無法執行預期動作時,會擲回例外狀況。 不論呼叫堆疊上有多少層級,其他程式碼都可以使用 try - catch 區塊選擇性地復原。

獨特的 C# 功能

C# 的某些元素可能較為不熟悉。 Language Integrated Query (LINQ) 提供一般模式型語法,可查詢或轉換任何資料集合。 LINQ 會統一語法來查詢記憶體內部集合、XML 或 JSON 等結構化資料、資料庫儲存體,甚至是雲端式資料 API。 您了解一組語法,不論其儲存空間為何,您都可以搜尋及操作資料。 下列查詢會尋找成績平均大於 3.5 的所有學生:

var honorRoll = from student in Students
                where student.GPA > 3.5
                select student;

上述查詢適用於 Students 所表示的許多儲存體型別。 其可為物件的集合、資料庫資料表、雲端儲存空間 Blob 或 XML 結構。 相同的查詢語法適用於所有儲存體型別。

以工作為基礎的非同步程式設計模型可讓您撰寫程式碼,如同以同步方式執行一樣讀取,即使其以非同步方式執行也一樣。 其會利用 asyncawait 關鍵字來描述非同步的方法,以及運算式何時會以非同步方式進行評估。 下列範例會等候非同步 Web 要求。 當非同步作業完成時,方法會傳回回應的長度:

public static async Task<int> GetPageLengthAsync(string endpoint)
{
    var client = new HttpClient();
    var uri = new Uri(endpoint);
    byte[] content = await client.GetByteArrayAsync(uri);
    return content.Length;
}

C# 也支援 await foreach 陳述式以逐一查看非同步作業所支援的集合,例如 GraphQL 分頁 API。 下列範例會以區塊讀取資料,並傳回列舉程式,以在可用時提供每個元素的存取權:

public static async IAsyncEnumerable<int> ReadSequence()
{
    int index = 0;
    while (index < 100)
    {
        int[] nextChunk = await GetNextChunk(index);
        if (nextChunk.Length == 0)
        {
            yield break;
        }
        foreach (var item in nextChunk)
        {
            yield return item;
        }
        index++;
    }
}

呼叫端可以使用 await foreach 陳述式來逐一查看集合:

await foreach (var number in ReadSequence())
{
    Console.WriteLine(number);
}

C# 提供模式比對。 這些運算式可讓您檢查資料,並根據其特性做出決策。 模式比對提供絕佳的語法,可讓您根據資料控制流程。 下列程式碼示範如何使用模式比對語法來表示布林值 andorxor 作業的方法:

public static bool Or(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

public static bool And(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => false,
        (false, true) => false,
        (false, false) => false,
    };
public static bool Xor(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => false,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

模式比對運算式可以使用 _ 做為所有值的 catch 來進行簡化。 下列範例示範如何簡化 and 方法:

public static bool ReducedAnd(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (_, _) => false,
    };

最後,在 .NET 生態系統中,您可以使用 Visual StudioVisual Studio Code 搭配 C# DevKit。 這些工具能讓您深入了解 C#,包括您撰寫的程式碼。 其也會提供偵錯功能。