概述: 介紹您準備好將您的 C# 編程技能提升到一個新的水平了嗎?然後,您需要了解類和結構之間的區別。作為 C# 編程的兩個最基本的構建塊,知道如何以及何時使用它們對於建立高效、有效的程式碼至關重要。在本文中,我將為您提供了解 C# 中的類和結構的綜合指南。我們將首先簡要概述一下類和結構是什麽。然後,我們將深入探討它們之間的主要區別,並提供真實範例來幫助說明它們的用法。但這還不是全部。我們還進行了效能測試,以比較 C# 中類和結構的速度和資源消耗。你將深入了解我們的結果,並了解它們對 C# 開發人員的意義。那麽,讓我們開始吧!II. 什麽是類?類是物件導向編程的構建塊,它們是每個開發人員都需要理解的基本
介紹
您準備好將您的 C# 編程技能提升到一個新的水平了嗎?
然後,您需要了解類和結構之間的區別。作為 C# 編程的兩個最基本的構建塊,知道如何以及何時使用它們對於建立高效、有效的程式碼至關重要。
在本文中,我將為您提供了解 C# 中的類和結構的綜合指南。我們將首先簡要概述一下類和結構是什麽。然後,我們將深入探討它們之間的主要區別,並提供真實範例來幫助說明它們的用法。
但這還不是全部。我們還進行了效能測試,以比較 C# 中類和結構的速度和資源消耗。你將深入了解我們的結果,並了解它們對 C# 開發人員的意義。
那麽,讓我們開始吧!
II. 什麽是類?
類是物件導向編程的構建塊,它們是每個開發人員都需要理解的基本概念。在 C# 中,類用於封裝數據和行為,允許您建立可重用的模組化程式碼。
若要在 C# 中建立類,請使用 class 關鍵字,後跟類的名稱。例如:
classPerson
{
// class members go here
}
定義類後,可以使用關鍵字從中建立物件。例如:new
Person john = newPerson();
這將建立一個名為 的類的新例項。現在,您可以使用物件存取類的內容和方法。PersonjohnPersonjohn
讓我們仔細看看班級內部的內容。可以在類中定義兩種主要型別的成員:欄位和方法。
欄位是儲存數據的變量,通常用於表示物件的狀態。例如,一個類可能包含人員姓名、年齡和地址的欄位:Person
classPerson
{
string name;
int age;
string address;
}
另一方面,方法是執行操作或計算的函式。它們可以存取和操作物件的欄位,以及執行其他操作。例如,一個類可能有一個根據其出生日期計算此人的年齡的方法:Person
classPerson
{
string name;
DateTime dateOfBirth;
publicintGetAge()
{
DateTime today = DateTime.Today;
int age = today.Year - dateOfBirth.Year;
if (dateOfBirth > today.AddYears(-age))
age--;
return age;
}
}
在此範例中,該方法使用人員的出生日期欄位根據當前日期計算其年齡。GetAge
使用類的主要好處之一是它們允許您封裝數據和行為,這意味著您可以隱藏程式碼的實作細節,並僅公開其他開發人員使用所需的部份。這使您的程式碼更加模組化且更易於維護。
除了欄位和方法之外,還可以定義其他型別的類成員,包括建構函式、內容、事件和巢狀類。其中每一種都有特定的用途,可以幫助您建立更強大、更靈活的程式碼。
建構函式是用於在建立物件時初始化物件欄位的特殊方法。它們與類同名,並使用關鍵字定義。下面是一個範例:public
classPerson
{
publicstring Name;
publicPerson(string name)
{
Name = name;
}
}
在此範例中,該類具有一個建構函式,該建構函式采用參數並將欄位設定為該值。當您建立一個新物件時,您可以傳入一個名稱,該名稱將被分配給該欄位:PersonnameNamePersonName
Person john = newPerson("John");
建構函式可以有多個參數,也可以多載。這意味著您可以使用不同的參數列定義多個建構函式。下面是一個範例:
classPerson
{
publicstring Name;
publicint Age;
publicPerson(string name)
{
Name = name;
Age = 0;
}
publicPerson(string name, int age)
{
Name = name;
Age = age;
}
}
在此範例中,該類有兩個建構函式:一個采用參數並將欄位設定為 ,另一個同時采用 a 和參數並設定這兩個欄位。PersonnameAge0nameage
解構函式用於執行物件被銷毀時需要執行的任何清理任務。它們是使用符號後跟類名稱定義的。下面是一個範例:~
classPerson
{
publicstring Name;
publicPerson(string name)
{
Name = name;
}
~Person()
{
Console.WriteLine("Person object destroyed.");
}
}
在此範例中,該類具有一個解構函式,該解構函式只是在物件被銷毀時將訊息寫入控制台。您不直接呼叫解構函式;相反,當不再使用物件時,垃圾回收器會自動呼叫它們。Person
值得註意的是,您並不總是需要在類中定義解構函式。事實上,在大多數情況下,您根本不需要。解構函式主要用於釋放非托管資源,例如檔控制代碼或資料庫連線。如果類不使用任何非托管資源,則無需定義解構函式。
除了解構函式之外,C# 還提供了稱為終端子的功能。
終端子與解構函式類似,因為它們用於執行清理任務,但它們的工作方式略有不同。終端子使用符號後跟類名進行定義,垃圾回收器在銷毀物件之前呼叫它們。但是,由於終端子是由垃圾回收器呼叫的,因此無法準確預測何時呼叫它們,甚至無法預測它們是否會被呼叫。出於這個原因,應謹慎使用終端子,並且僅在您別無選擇時才使用。~
現在我們已經深入介紹了類,讓我們繼續討論一個相關主題:C# 中的結構。
III. 什麽是結構體?
結構體是「結構體」的縮寫,是 C# 中使用者定義的值型別。它類似於類,因為它可以包含成員變數和成員函式(方法),但兩者之間存在一些關鍵差異。
結構和類之間的主要區別之一是結構是 值型別 ,而類是 參照型別 。這意味著,當您建立結構的例項時,它會在堆疊上分配,而類的例項會在堆上分配。
另一個區別是結構不能繼承自基礎類別或用作基礎類別。但是,結構體可以實作介面,就像類一樣。
結構體的目的是將相關數據組合成一個單元。這可以使您的程式碼更有條理、更易於理解, 並且在記憶體使用方面更有效(您將在本文末尾看到效能測試結果。所以,繼續閱讀)。
下面是 Employee 結構在 C# 中可能是什麽樣子的範例:
structEmployee
{
publicstring name;
publicint id;
publicdouble salary;
}
在此範例中,結構包含三個公共成員變數:name(字串)、id(int)和 payual(雙精度)。
在 C# 中,可以使用或不使用「new」關鍵字建立結構體的例項。
// Creating a struct instance with the "new" keyword
structPerson
{
publicstring name;
publicint age;
}
Person person1 = newPerson();
person1.name = "John";
person1.age = 30;
在此範例中,我們定義了一個名為「Person」的結構,其中包含兩個公共成員變數:「name」(字串)和「age」(整數)。然後,我們使用「new」關鍵字建立一個名為「person1」的結構的新例項,並使用點表示法設定其成員變數。
// Creating a struct instance without the "new" keyword
structPoint
{
publicint x;
publicint y;
}
Point point1;
point1.x = 5;
point1.y = 10;
在此範例中,我們定義了一個名為「Point」的結構,其中包含兩個公共成員變數:「x」(一個 int)和「y」(一個 int)。然後,我們在不使用「new」關鍵字的情況下建立一個名為「point1」的結構的新例項,並使用點表示法設定其成員變數。
這是可能的,因為結構是值型別,並且在聲明時會自動初始化為其預設值(例如,0 表示整數)。
但是,通常最好使用「new」關鍵字來建立結構例項,即使您最初不需要設定其成員變數。
IV. C# 中類和結構之間的一些主要區別:
**記憶體分配:**建立類的例項時,將在堆上分配記憶體。建立結構體的例項時,會在堆疊上分配記憶體。這意味著結構的分配和解除分配通常比類更快。
**遺產:**類支持繼承,這意味著您可以建立一個新類來繼承現有類的數據和行為。結構不支持繼承。
**多型性:**類支持多型性,這意味著您可以建立共享公共基礎類別或介面的不同類的物件。結構不支持多型性。
**裝箱和拆箱:**裝箱是將值型別(如結構)轉換為物件參照型別(如類)的過程。取消裝箱是將物件參照型別轉換回值型別的過程。裝箱和拆箱可能很慢,並可能導致記憶體碎片。類不需要裝箱和拆箱,但結構需要。
**易變性:**在 C# 中,可變性是指物件在建立後更改其內部狀態的能力。這意味著可以透過添加、刪除或更改可變物件的內容、欄位或元素來修改可變物件。
另一方面,不可變物件是建立後狀態無法更改的物件。
一旦建立了不可變物件,其內部狀態就會被固定,任何修改它的嘗試都將導致建立一個新物件。由於這個問題很重要,我想我會在另一篇文章中深入解釋。
類和結構可以是可變的,也可以是不可變的,這取決於它們的設計方式。
但是,由於結構是值型別,因此預設情況下,它們通常被設計為不可變的。
V. 您可能希望使用類或結構的一些方案:
如果需要支持繼承或多型性,或者需要建立將透過參照傳遞的大型物件, 請使用類 。
如果需要建立一個將按值傳遞的小物件,或者需要建立一個不會經常變異的物件, 請使用結構 。
由於「EmployeeStruct」的例項是在堆疊上分配的,因此可以比在堆上分配的「Employee class」例項更快地存取和操作它們。
然而,在大多數套用中,這種效能差異通常可以忽略不計。
在檢查了類和結構之後,如何從 資源消耗 和 速度 方面進行比較?
五、基準測試
對於基準測試,我想到了兩種情況。我根據日常生活中經常遇到的情況創造了這兩個場景。
測試一
根據第一種情況,需要將應該從服務中獲取的數據模型記錄在不同的表中。
因此,從服務接收的數據必須對映到兩個不同的數據模型。
我透過使用類和結構建立數據模型來測試資源消耗和處理速度。
讓我們看看你對結果的看法?
1,000 條記錄的測試結果:
包含 10,000 條記錄的測試結果。
具有 100,000 條記錄的測試結果。
具有 1,000,000 條記錄的測試結果。
根據測試結果可以看出,使用 struct 時消耗的資源更少,獲得的結果更快。
您可以透過單擊此處在我的 GitHub 帳戶上存取測試的原始碼。
如果你給我的計畫一顆星,我會非常高興。
提前感謝您的好意。
測試二
在第二種情況下,我嘗試透過向陣列數據結構添加指定數量的值來測試資源消耗和處理速度。
結果如下所示。
從這兩個測試的結果來看,我們可以說_ 結構比類的效能更高。 _
總之,了解 C# 中的類和結構對任何開發人員都至關重要。
它們用途廣泛、靈活,易於維護和組織程式碼。
透過利用這些,您可以建立滿足計畫需求的強大而高效的計劃。
如果你喜歡我的文章,請給我一個贊!謝謝