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