Struct結構和Class類的區別

2021-07-24 20:33:49 字數 2838 閱讀 1195

**dooroo,侵權聯刪

1,定義和使用非常相似,例子如下:

public struct student

public class question

使用:student s=new student();

question q=new question();

2,兩者都是container型別,這表示它們可以包含其他資料型別作為成員。

3,兩者都擁有成員,包括:建構函式、方法、屬性、字段、常量、列舉型別、事件、以及事件處理函式。

4,兩者的成員都有其各自的訪問範圍。例如,可以將某乙個成員宣告為public,而將另乙個成員宣告為private。

5,兩者都可以實現介面。

6,兩者都可以公開乙個預設屬性,然而前提是這個屬性至少要取得乙個自變數。

7,兩者都可以宣告和觸發事件,而且兩者都可以宣告委託(delegate)。

二、結構體和類的主要區別

在網上摘抄了兩段:

=====第一段:=====

1,結構是實值型別(value types),而類則是引用型別(reference types)。

2,結構使用棧儲存(stack allocation),而類使用堆儲存(heap allocation)。

3,所有結構成員預設都是public,而類的變數和常量數則預設位private,不過其他類成員預設都是public。

4,結構成員不能被宣告位protected,而類成員可以。

5,結構變數宣告不能指定初始值、使用new關鍵字貨對陣列進行初始化,但是類變數宣告可以。

6,結構不能宣告預設的建構函式,也就是不擁有引數的非共享建構函式,但是類則無此限制。

7,二者都可以擁有共享建構函式,結構的共享建構函式不能帶有引數,但是類的共享建構函式則可以帶或者不帶引數。

8,結構不允許宣告析構函式(destructor),類則無此限制。

9,結構的例項(instance)宣告,不允許對包含的變數進行初始化設定,類則可以在宣告類的例項時,同時進行變數初始化。

10,結構是隱式繼承自valuetype類,而且不能繼承任何其他型別,類則可以繼續自valuetype以外的任何類。

11,結構是無法被繼承的,類則可以。

12,結構永遠不會終止,因此clr不會在任何結構上呼叫finalize方法。類則是由記憶體**程序加以終止,當記憶體**程序檢測到沒有任何作用的類時,它就會呼叫類的finalize方法。

13,結構不需要建構函式,類則需要建構函式。

14,結構只能在一種情況下使用非共享建構函式,那就是非共享建構函式會接受引數。但是類則無此限制,它可以使用帶引數或不帶引數的非共享建構函式。

14,每乙個結構都具有無引數的隱含公共建構函式,此建構函式會將結構的所有成員初始化為其預設值。不需要重新定義這個行為。

在「例項和變數」層面上,由於結構是數值型別的,因此每乙個結構變數會永遠的繫結到結構例項上。然而類是引用型別的,而且物件變數可引用不同的類例項,在此方面的區別,會對使用將結構和類造成如下的影響:

15,結構變數會隱式的使用結構的無引數建構函式來初始化成員,這就意味語句 struct s = new struct()。

16,當您將乙個結構變數賦值給另乙個,或者將結構例項傳遞到程式變數時,所有變數成員的值會複製到新的結構中。當您將乙個物件變數賦值給另乙個,或者將物件變數傳遞給程式時,則只是複製指標。

17,您可以將null值賦值給結構變數,但是該例項會一直與該變數保持關聯。雖然變數成員會因此賦值而重新初始化,但是您還是可以呼叫變數的方法並訪問其資料成員。相反的,如果您將物件變數設定為null,您就會中斷它與任何型別例項的關聯,而且除非您再將另乙個例項賦值給它,否則無法通過變數訪問任何成員。

18,您可以在不同時間將不同的類的例項賦值給同乙個物件變數,而且在同一時間可有好幾個物件變數引用相同的類例項,如果您對類成員值做了改變,則其他指向相同例項的物件變數也會發生改變。然而,結構成員則會封裝在他們自己的例項中,變更結構成員值並不會對其他任何結構變數的成員造成影響,甚至也不會影響相同結構宣告的其他例項。

19,兩個結構必須以成員對成員的比較方式來執行相等比較。兩個物件變數可以使用equals方法來加以比較。equals會判斷兩個變數是否指向相同的例項。

=====第二段:=====

1,結構體是一種值型別,而類是引用型別。值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作。

2,結構體的定義是:有些資料既是相互關聯的,又共同描述乙個完整事物,如:乙個學生的整體資訊,學號、姓名、性別等。而類則使用在需要比較有層次的資料上面。

3,類是反映現實事物的一種抽象,而結構體的作用只是一種包含了具體不同類別資料的一種包裝,結構體不具備類的繼承多型特性

4,建構函式是為了初始化類的字段而存在的,而結構體並不需要初始化就能使用,因此,結構體中並不存在預設的建構函式。

結構:沒有預設的建構函式,但是可以新增建構函式

沒有析構函式

沒有 abstract 和 sealed(因為不能繼承)

不能有protected 修飾符

可以不使用new 初始化

在結構中初始化例項欄位是錯誤的

類: 有預設的建構函式

有析構函式

可以使用 abstract 和 sealed

有protected 修飾符

必須使用new 初始化

三.如何選擇結構還是類

1.  堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些

2.   結構表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告乙個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。

3.  在表現抽象和多級別的物件層次時,類是最好的選擇

4.  大多數情況下該型別只是一些資料時,結構時最佳的選擇

C 類class和結構體struct區別

參考改編自 c 語言繼承了c語言的struct,並且加以擴充。在c語言中struct是只能定義資料成員,而不能定義成員函式的。而在c 中,struct類似於class,在其中既可以定義資料成員,又可以定義成員函式。在c 中,struct與class基本是通用的,唯一不同的是如果使用class關鍵字,...

C 的類(Class)與結構(Struct)

在 c 中,結構是值型別資料結構。它使得乙個單一變數可以儲存各種資料型別的相關資料。struct關鍵字用於建立結構。結構是用來代表乙個記錄。假設您想跟蹤圖書館中書的動態。您可能想跟蹤每本書的以下屬性 為了定義乙個結構,您必須使用 struct 語句。struct 語句為程式定義了乙個帶有多個成員的新...

C 類 class 與結構 struct 的異同

結構與類共享幾乎所有相同的語法,但結構比類受到的限制更多 儘管結構的靜態字段可以初始化,結構例項字段宣告還是不能使用初始值設定項。結構不能宣告預設建構函式 沒有引數的建構函式 或析構函式。結構的副本由編譯器自動建立和銷毀,因此不需要使用預設建構函式和析構函式。實際上,編譯器通過為所有字段賦予預設值 ...