共用方式為


C# 語言教學導覽

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

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

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

Hello World

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

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

開頭為 // 的行是單行註解。 C# 單行註解開頭為 //,且繼續到目前行的結尾。 C# 也支援多行註解。 多行註解開頭為 /*,結尾為 */WriteLine 類別的 Console 方法位於 System 命名空間中,會產生程序的輸出。 此類別是由標準類別程式庫提供,根據預設,在每個 C# 程式中都會自動參考此程式庫。 另一個程式窗體會要求您宣告程序進入點的包含類別和方法。 當您使用最上層語句時,編譯程式會合成這些元素。

這個替代格式仍然有效,而且包含所有 C# 程式中的許多基本概念。 許多現有的 C# 範例都使用下列對等格式:

using System;
namespace TourOfCsharp;

class Program
{
    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” 程式宣告的 Program 類別包含單一成員,即名為 Main 的方法。 Main 方法的宣告是使用 static 修飾元來進行。 實例方法可以使用關鍵字 this 來參考特定的封入物件實例,而靜態方法則可以在不需要參考特定物件的情況下運作。 依照慣例,在沒有最上層陳述式的情況下,名為 Main 的靜態方法會做為 C# 程式的進入點。 包含 Main 方法的類別通常會命名為 Program

提示

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

熟悉的 C# 功能

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

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

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

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

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

獨特的 C# 功能

C# 的某些元素可能較為不熟悉。

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,
    };

模式比對運算式可以使用 _ 來當作任何值的萬用符以簡化。 下列範例示範如何簡化 and 方法:

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

上述範例也會宣告 元組、輕量型資料結構。 元組 是具有選擇性名稱和個別類型之值的已排序、固定長度序列。 您會以 () 字元括住序列。 宣告 (left, right) 定義具有兩個布林值的元組:leftright。 每個 switch arm 都會宣告一個元組值,例如 (true, true)。 Tuple 提供方便的語法,以宣告具有多個值的單一值。

集合表示式 提供一般語法來提供集合值。 您可以在 [] 字元之間撰寫值或表示式,而編譯程式會將該表示式轉換成必要的集合類型:

int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<string> names = ["Alice", "Bob", "Charlie", "David"];

IEnumerable<int> moreNumbers = [.. numbers, 11, 12, 13];
IEnumerable<string> empty = [];

上一個範例顯示可以使用集合表達式初始化的不同集合類型。 其中一個範例會使用 [] 空集合表達式來宣告空集合。 另一個範例會使用 ..擴展元素 展開集合,並將其所有值新增至集合表達式。

您可以使用 索引範圍 表示式,從可編制索引的集合擷取一或多個元素:

string second = names[1]; // 0-based index
string last = names[^1]; // ^1 is the last element
int[] smallNumbers = numbers[0..5]; // 0 to 4

^ 索引表示從結尾,而不是從頭開始。 ^0 元素是數據集後面的元素,因此 ^1 是最後一個元素。 範圍表達式中的 .. 表示要包含的項目範圍。 範圍從第一個索引開始,並包含所有元素,直至但不包含最後一個索引處的元素。

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);
}

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