本教學課程會教導您如何在 C# 中建立類型。 您撰寫少量的程式代碼,然後編譯並執行該程序代碼。 本教學課程包含一系列課程,可探索 C# 中不同類型的類型。 這些課程會教您 C# 語言的基本概念。
小提示
當代碼段區塊包含 [執行] 按鈕時,該按鈕會開啟互動式視窗,或取代互動式視窗中的現有程序代碼。 當程式碼片段不包含 [執行] 按鈕時,您可以複製程式代碼並將其加入目前的互動式視窗。
上述教學課程使用文字和數位。 字串和數位是 簡單的類型:它們都會儲存一個單一值。 隨著程序變大,您需要使用更複雜的數據結構。 C# 提供不同類型的類型,您可以在需要具有更多字段、屬性或行為的數據結構時定義。 讓我們開始探索這些類型。
Tuple
Tuple 是具有固定長度之值的排序序列。 Tuple 的每個元素都有一個類型和可選名稱。 下列程式代碼會宣告代表 2D 點的元組。 選取 [執行] 按鈕,將下列程式代碼貼到互動式視窗中並加以執行。
var pt = (X: 1, Y: 2);
var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");
小提示
當您探索 C# 或任何程式設計語言時,您在撰寫程式代碼時犯了錯誤。 編譯 程式 會尋找這些錯誤,並將其回報給您。 當輸出包含錯誤訊息時,請仔細查看範例程式碼與互動視窗中的程式碼,來找到需要修正的地方。 該練習可協助您瞭解 C# 程式代碼的結構。
您可以重新指派元組中的任意成員。 在現有的程式代碼之後,於互動式視窗中新增下列程序代碼。 再次按 [執行] 以查看結果。
pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");
您也可以使用 with 表達式,建立已修改原始複本的新 Tuple。 在程式代碼已在互動式視窗中之後新增下列程式代碼,然後按 [執行] 以查看結果:
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");
Tuple pt2 包含 pt 的 X 值(6),而 pt2.Y 的值為 10。
Tuple 是一種結構化類型。 換句話說,元組類型沒有像string或int這樣的名稱。 Tuple 類型是由成員數目所定義,稱為 arity,以及這些成員的類型。 成員名稱是為了方便起見。 即使成員名稱不同,您也可以將一個 Tuple 指派給具有相同元組數量和類型的另一個 Tuple。 您可以在您已在互動式視窗中撰寫的程式代碼之後新增下列程式代碼,並加以嘗試:
var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);
變數 subscript 有兩個成員,兩者都是整數。
subscript和pt都是相同的元組類型的實例:包含2個int成員的元組。
元組很容易建立:您只需宣告圓括號中的多個成員即可。 下列所有宣告了具有不同元素個數和成員類型的不同元組。 新增以下程式碼以建立新的元組類型:
var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);
Tuple 很容易建立,但其功能有限。 Tuple 類型沒有名稱,因此您無法將意義傳達給值集。 Tuple 類型無法新增行為。 C# 有其他類型的類型,您可以在類型定義行為時建立。
建立記錄類型
當您想要相同結構中的多個值時,Tuple 非常適合這些時間。 它們是輕量型的,而且可以在使用時宣告。 隨著程式的進行,您可能會發現在整個程式碼中使用相同的元組類型。 如果您的應用程式在 2D 圖形空間中運作,用於表示點的組合可能會很常見。 一旦您找到了所需的資料,您即可宣告一個 record 型別來儲存這些值,並提供更多功能。 下列程式代碼範例會使用 Main 方法來代表程序的進入點。 這樣一來,您就可以在程式的入口點之前宣告record類型。 按下下列程序代碼上的 [執行] 按鈕,以下列程式代碼取代現有的範例。
警告
請勿複製並貼上。 互動式窗口必須重設,才能執行下列範例。 如果您犯了錯誤,視窗會停止回應,需要重新整理頁面才能繼續。
下列程式代碼會宣告並使用 record 型別來表示 Point,然後在 Main 方法中使用該 Point 結構:
public record Point(int X, int Y);
public static void Main()
{
Point pt = new Point(1, 1);
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The two points are {pt} and {pt2}");
}
record 聲明是一行 Point 類型的程式碼,將 X 和 Y 的值儲存在唯讀屬性中。 不論您在何處使用該類型,您都使用名稱 Point 。 正確命名的類型,例如 Point,提供有關類型使用方式的資訊。
Main方法會示範如何使用with表達式來建立新點,該點是現有點的修改複本。 這一行pt2 = pt with { Y = 10 }表示:「pt2與pt具有相同的值,但Y被指定為 10」。您可以在單一with表示式中新增任意數目的屬性來進行變更。
上述 record 宣告是以 結尾 ;的單行程序代碼,就像所有 C# 語句一樣。 您可以透過宣告成員來為record類型增加行為。 記錄成員可以是函式或更多數據元素。 型別的成員位於類型宣告中,於{和}字元之間。 以下列程式代碼取代您所做的記錄宣告:
public record Point(int X, int Y)
{
public double Slope() => (double)Y / (double)X;
}
然後,將下列程式代碼添加到包含 with 表達式的行之後的 Main 方法:
double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");
您將正式用語新增至代表 X 和 Y 值的 元組。 您已將其 record 設為定義具名型別的 ,並包含用來計算斜率的成員。
record 型別是 record class 的速記:class 型別包含額外的行為。 您也可以修改 Point 類型,使其成為 record struct :
public record struct Point(int X, int Y)
{
public double Slope() => (double) Y / (double) X;
}
record struct是類型struct,包含新增至所有record型別的額外行為。
結構、類別和介面類型
C# 中的所有具名類型都是 class 或 struct 類型。
class是參考型別。
struct是實值型別。 實值類型的變數會將實例內容內嵌在記憶體中儲存。 換句話說,會儲存兩個 record struct Point 整數: X 和 Y。 參考類型的變數會儲存指向實例儲存空間的參考或指標。 換句話說,record class Point會儲存對保存X和Y值的記憶體區塊的參考。
實際上,這表示實值型別會在指派時複製,但類別實例的複本是 參考的複本。 複製的參考指的是相同點的實例,並具有相同的X和Y存儲。
編譯器會根據 record 修飾符為您生成多個成員。 您可以在基本概念一節的 記錄類型 文章中深入瞭解。
當您宣告類型 record 時,您會宣告該類型應該使用一組預設的行為來進行等值比較、指派和複製該類型的實例。 當主要責任是儲存相關數據時,記錄是最佳選擇。 當您新增更多行為時,請考慮使用 struct 或 class 類型,而不使用 record 修飾詞。
當需要更複雜的行為時,您可以使用 struct 型別針對實值型別,但以儲存值為主要責任。 您可以使用 class 類型來使用面向物件慣用語,例如封裝、繼承和多型。
您也可以定義 interface 類型,以宣告不同類型必須實作的行為合約。
struct和 class 類型都可以實作介面。
您通常會在較大的程式和程式庫中使用這些類型。 安裝 .NET SDK 之後,您可以使用基本概念一節中 類別 的教學課程來探索這些類型。
您已完成「在 C# 中建立類型」互動式教學課程。 您可以選取 [分支和迴圈 ] 鏈接以啟動下一個互動式教學課程,或者您可以流覽 .NET 網站來下載 .NET SDK、在您的計算機上建立專案,以及繼續撰寫程式代碼。 「後續步驟」一節會帶您回到這些教學課程。
您可以在下列文章中深入瞭解 C# 中的類型: