結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。
類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量指向同一個堆內存 一個修改數據 另外一個也修改。
目錄
1.?數據類型本質
2.?默認繼承行為
3.?實例化方式
4.?默認成員初始化
5.?構造函數特性
6.?內存管理與生命周期
7.?比較行為
8.?適用場景
總結對比表
在 C# 等面向對象編程語言中,結構體(Struct)和類(Class)是兩種重要的數據類型,它們在內存管理、行為特性等方面存在顯著區別。以下從多個維度詳細說明二者的核心差異:
1.?數據類型本質
- 結構體(Struct):屬于值類型(Value Type),直接存儲數據本身。
內存分配在棧(Stack)?上(或作為引用類型的一部分嵌入在堆中),當結構體變量被賦值、傳遞時,會創建完整的副本。 - 類(Class):屬于引用類型(Reference Type),存儲的是數據的引用(地址)。
內存分配在堆(Heap)?上,變量僅保存指向堆中數據的指針,賦值或傳遞時僅復制引用(不會復制數據本身)。 - 類實例化出的對象(即類的實例)存儲在堆(Heap)中,而指向該對象的引用(變量)則存儲在棧(Stack)中。
2.?默認繼承行為
- 結構體:默認繼承自?
System.ValueType
(間接繼承自?object
),但不能繼承其他類或結構體,也不能被其他類繼承( sealed 特性)。
支持實現接口。 - 類:默認繼承自?
object
,可以繼承其他類(單繼承),也可以被其他類繼承(除非聲明為?sealed
)。
同樣支持實現接口。
3.?實例化方式
- 結構體:
- 可以不使用?
new
?關鍵字實例化(此時成員變量為默認值,如?int
?為 0)。 - 例如:
Point p; p.X = 10;
(Point
?是結構體)。 - 使用?
new
?時,會調用構造函數初始化成員。
- 可以不使用?
- 類:
- 必須使用?
new
?關鍵字調用構造函數實例化(否則變量為?null
,直接訪問成員會報錯)。 - 例如:
Person p = new Person();
(Person
?是類)。
- 必須使用?
4.?默認成員初始化
- 結構體:
- 不能在聲明時為成員變量設置默認值(需在構造函數中初始化)。
- 例如:
struct Point { public int X = 0; }
(編譯錯誤)。
- 類:
- 可以在聲明時為成員變量設置默認值。
- 例如:
class Person { public int Age = 18; }
(合法)。
5.?構造函數特性
- 結構體:
- 無默認無參構造函數(編譯器不會自動生成,若手動定義構造函數,必須為所有成員賦值)。
- 例如:
struct Point { public int X; public Point(int x) { X = x; } }
(合法,因初始化了所有成員)。
- 類:
- 編譯器會自動生成默認無參構造函數(若未手動定義任何構造函數)。
- 可以定義有參構造函數,且無需顯式初始化所有成員(未初始化的成員為默認值)。
6.?內存管理與生命周期
- 結構體:
- 生命周期與所在作用域一致(如方法內的結構體變量,方法執行結束后棧內存自動釋放)。
- 無需垃圾回收(GC),性能開銷較低(適合小型數據結構)。
- 類:
- 實例在堆上分配,生命周期由 GC 管理(當沒有引用指向時,會被 GC 回收)。
- 存在 GC 開銷,適合大型、復雜的對象(如業務實體)。
7.?比較行為
- 結構體:
- 默認按值比較(比較所有成員是否相等)。
- 例如:兩個?
Point
?結構體,若?X
?和?Y
?分別相等,則認為相等。
- 類:
- 默認按引用比較(比較是否指向堆中同一個實例)。
- 例如:兩個?
Person
?類實例,即使成員完全相同,若引用不同則認為不相等(需重寫?Equals
?方法實現值比較)。
8.?適用場景
- 結構體:
- 適合表示小型、簡單的數據(如坐標?
Point
、顏色?Color
、日期?DateTime
?等)。 - 強調數據的值語義(傳遞時需要副本),且無需繼承或多態特性。
- 適合表示小型、簡單的數據(如坐標?
- 類:
- 適合表示復雜的對象(如?
User
、Order
?等業務實體)。 - 需要繼承、多態,或實例較大、需要長期存在(通過引用共享)的場景。
- 適合表示復雜的對象(如?
總結對比表
特性 | 結構體(Struct) | 類(Class) |
---|---|---|
數據類型 | 值類型 | 引用類型 |
內存分配 | 棧(或嵌入堆) | 堆 |
賦值 / 傳遞行為 | 復制值(副本) | 復制引用(共享實例) |
繼承 | 不能繼承 / 被繼承(除接口) | 支持繼承和被繼承 |
實例化 | 可省略?new | 必須用?new |
成員默認值 | 不允許聲明時初始化 | 允許聲明時初始化 |
構造函數 | 無默認無參構造函數,需初始化所有成員 | 有默認無參構造函數,可部分初始化 |
比較方式 | 默認值比較 | 默認引用比較 |
適用場景 | 小型簡單數據,值語義 | 復雜對象,引用語義,需繼承多態 |
通過以上區別可以看出,結構體和類的選擇主要取決于數據的復雜度、是否需要共享引用以及是否依賴繼承多態等特性。
C# 結構體https://blog.csdn.net/LZQqqqqo/article/details/149511030?spm=1001.2014.3001.5502C# 面向對象__類_對象
https://blog.csdn.net/LZQqqqqo/article/details/149546454?spm=1001.2014.3001.5502