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# 對於大括弧 {
和 }
、if
、else
和 switch
等控制項陳述式,以及 for
和 while
等迴圈建構有相同的用法。 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
類別),和許多其他命名空間 (如 IO
和 Collections
)。 使用 using
指示詞參考指定的命名空間,就能以非限定的方式使用屬於該命名空間成員的型別。 因為 using
指示詞的緣故,該程式可以使用 Console.WriteLine
當作 System.Console.WriteLine
的縮寫。 在先前的範例中,該命名空間已隱含地被納入。
“Hello, World” 程式宣告的 Program
類別包含單一成員,即名為 Main
的方法。
Main
方法的宣告是使用 static
修飾元來進行。 實例方法可以使用關鍵字 this
來參考特定的封入物件實例,而靜態方法則可以在不需要參考特定物件的情況下運作。 依照慣例,在沒有最上層陳述式的情況下,名為 Main
的靜態方法會做為 C# 程式的進入點。 包含 Main
方法的類別通常會命名為 Program
。
提示
本文中的範例可讓您先查看 C# 程式碼。 某些範例可能會顯示您不熟悉的 C# 元素。 當您準備好學習 C# 時,請從我們的初學者教學課程開始,或深入了解每個章節中的連結。 如果您熟悉 Java、JavaScript、TypeScript或 Python,請參考我們的建議,幫助您快速查找所需資訊以學習 C#。
熟悉的 C# 功能
C# 適用於初學者,但會針對撰寫特殊化應用程式的資深開發人員提供進階功能。 您可以快速提高生產力。 您可以在應用程式需要更特殊化的技術時,深入了解這些技術。
C# 應用程式受益於 .NET 執行階段的自動記憶體管理。 C# 應用程式也會使用 .NET SDK 所提供的大量執行階段連結庫。 某些元件與平台無關,例如檔案系統程式庫、資料收集和數學程式庫。 其他元件則專屬於單一工作負載,例如 ASP.NET Core Web 程式庫或 .NET MAUI UI 程式庫。 NuGet 上的豐富開放原始碼生態系統可增強執行階段一部分的程式庫。 這些程式庫能提供更多元件供您使用。
C# 是強型別語言。 您宣告的每個變數都有編譯時間已知的型別。 編譯器或編輯工具會告訴您是否不正確地使用該型別。 您在執行程式之前,可以修正這些錯誤。
基本資料類型內建於語言和執行階段:實值型別 (例如 int
、double
、char
)、參考型別 (例如 string
、陣列和其他集合)。 當您撰寫程式時,要建立自己的型別。 這些型別可為值的 struct
型別,或是定義物件導向行為的 class
型別。 您可以將 record
修飾元新增至 struct
或 class
型別,使編譯器合成程式碼以進行相等比較。 您也可以建立 interface
定義,以定義實作該介面的型別所必須提供的合約 (或一組成員)。 您也可以定義泛型型別和方法。
泛型在使用過程中,會使用型別參數來提供實際型別的預留位置。
當您撰寫程式碼時,可以定義函式,也稱為方法,做為 struct
和 class
型別的成員。 這些方法會定義你的型別的行為。 方法可以進行重載,使用不同數目或類型的參數。 方法可以選擇性地傳回值。 除了方法之外,C# 型別也可具有屬性,這些屬性是由稱為存取子的函式所支援的資料元素。 C# 型別可以定義事件,以允許型別向訂閱者通知重要動作。 C# 支援物件導向技術,例如 class
型別的繼承和多型。
C# 應用程式會使用例外狀況來報告及處理錯誤況。 如果您使用 C++ 或 Java,則這種做法很熟悉。 您的程式碼在無法執行預期動作時,會擲回例外狀況。 不論呼叫堆疊上有多少層級,其他程式碼都可以使用 try
- catch
區塊選擇性地復原。
獨特的 C# 功能
C# 的某些元素可能較為不熟悉。
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,
};
模式比對運算式可以使用 _
來當作任何值的萬用符以簡化。 下列範例示範如何簡化 and 方法:
public static bool ReducedAnd(bool left, bool right) =>
(left, right) switch
{
(true, true) => true,
(_, _) => false,
};
上述範例也會宣告 元組、輕量型資料結構。
元組 是具有選擇性名稱和個別類型之值的已排序、固定長度序列。 您會以 (
和 )
字元括住序列。 宣告 (left, right)
定義具有兩個布林值的元組:left
和 right
。 每個 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 結構。 相同的查詢語法適用於所有儲存體型別。
以工作為基礎的非同步程式設計模型可讓您撰寫程式碼,如同以同步方式執行一樣讀取,即使其以非同步方式執行也一樣。 其會利用 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);
}
最後,在 .NET 生態系統中,您可以使用 Visual Studio 或 Visual Studio Code 搭配 C# DevKit。 這些工具能讓您深入了解 C#,包括您撰寫的程式碼。 其也會提供偵錯功能。