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
類別),和許多其他命名空間 (如 IO
和 Collections
)。 使用 using
指示詞參考指定的命名空間,就能以非限定的方式使用屬於該命名空間成員的型別。 因為 using
指示詞的緣故,該程式可以使用 Console.WriteLine
當作 System.Console.WriteLine
的縮寫。 在先前的範例中,已隱含包含該命名空間。
“Hello, World” 程式宣告的 Hello
類別包含單一成員,即名為 Main
的方法。 Main
方法的宣告是使用 static
修飾元來進行。 執行個體方法可以使用關鍵字 this
參考特定的封入物件執行個體,但靜態方法卻不需要參考特定物件即可運作。 依照慣例,在沒有最上層陳述式的情況下,名為 Main
的靜態方法會做為 C# 程式的進入點。
這兩種進入點格式都會產生對等的程式碼。 當您使用最上層陳述式時,編譯器會合成程式進入點的包含類別和方法。
提示
本文中的範例可讓您先查看 C# 程式碼。 某些範例可能會顯示您不熟悉的 C# 元素。 當您準備好學習 C# 時,請從我們的初學者教學課程開始,或深入了解每個章節中的連結。 如果您有 Java、JavaScript、TypeScript 或 Python 方面的經驗,請閱讀我們的秘訣,以協助您找到快速了解 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# 對於大括弧 {
和 }
、if
、else
和 switch
等控制項陳述式,以及 for
和 while
等迴圈建構有相同的用法。 C# 也具有任何集合型別的 foreach
陳述式。
C# 是強型別語言。 您宣告的每個變數都有編譯時間已知的型別。 編譯器或編輯工具會告訴您是否不正確地使用該型別。 您在執行程式之前,可以修正這些錯誤。 基本資料類型內建於語言和執行階段:實值型別 (例如 int
、double
、char
)、參考型別 (例如 string
、陣列和其他集合)。 當您撰寫程式時,要建立自己的型別。 這些型別可為值的 struct
型別,或是定義物件導向行為的 class
型別。 您可以將 record
修飾元新增至 struct
或 class
型別,使編譯器合成程式碼以進行相等比較。 您也可以建立 interface
定義,以定義實作該介面的型別所必須提供的合約 (或一組成員)。 您也可以定義泛型型別和方法。 泛型在使用過程中,會使用型別參數來提供實際型別的預留位置。
當您撰寫程式碼時,可以定義函式,也稱為方法,做為 struct
和 class
型別的成員。 這些方法會定義型別的行為。 方法可以進行多載,使用不同數目或型別的參數。 方法可以選擇性地傳回值。 除了方法之外,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 結構。 相同的查詢語法適用於所有儲存體型別。
以工作為基礎的非同步程式設計模型可讓您撰寫程式碼,如同以同步方式執行一樣讀取,即使其以非同步方式執行也一樣。 其會利用 async
和 await
關鍵字來描述非同步的方法,以及運算式何時會以非同步方式進行評估。 下列範例會等候非同步 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# 提供模式比對。 這些運算式可讓您檢查資料,並根據其特性做出決策。 模式比對提供絕佳的語法,可讓您根據資料控制流程。 下列程式碼示範如何使用模式比對語法來表示布林值 and、or 和 xor 作業的方法:
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 Studio 或 Visual Studio Code 搭配 C# DevKit。 這些工具能讓您深入了解 C#,包括您撰寫的程式碼。 其也會提供偵錯功能。