C 中的結構與類

2021-04-25 12:39:21 字數 2354 閱讀 5433

c# corner今天發表了bechir bejaoui的一篇文章《what really make difference between structures and classes?》。關於結構和類的區別其實是老生常談,不過本文總結得較為全面,所以翻譯過來給大家共享。

總結起來,兩者共有如下區別:

2、據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。

3、類可以被繼承,而結構則不支援。

4、結構物件不能像類物件一樣賦值為null。

5、結構不能像類一樣定義析構器。

6、結構不能像類一樣定義為抽象的。

7、在結構中不能重寫方法,除非是object型別的如下方法:

equals()

gethashcode()

gettype()

tostring()

若要讓結構具有多型特性,可以讓其實現介面。

8、在類中定義的事件是執行緒安全的,而結構則不是。

9、結構總是具有乙個預設的公共無參建構函式,但卻不能像類一樣定義私有的無參建構函式(結構也不能再定義公共的無參建構函式,這與類不相同):

struct me

}class me

10、類中的靜態建構函式會被呼叫,而結構卻不能。因此在結構中定義的靜態建構函式,雖然可以編譯通過,但卻沒有價值:

11、結構不能像類一樣定義volatile欄位。volatile欄位主要用於併發,它相當於方法體的lock。

12、可以對結構型別使用sizeof,對類則不行。

13、類的字段會被自動初始化為0/false/null,而結構則不能。

14、在結構中不能直接對欄位初始化,而類則可以。struct mystructure

class myclass

15、結構和類對於system.object.equals()方法的體現是不相同的。例如定義這樣的結構和類:

struct structureperson

class classperson

如果執行如下的**:

class program

else

//this code displays strx = stry

classperson clsx = new classperson();

clsx.lastname = "bejaoui";

clsx.firstname = "bechir";

classperson clsy = new classperson();

clsy.lastname = "bejaoui";

clsy.firstname = "bechir";

if (clsx.equals(clsy))

else

//this code displays clsx != clsy

console.read();

}}

由於結構型別是值型別,因而equals()方法比較的是兩個物件的值是否相等,如果相等則返回true;而類型別為引用型別,equals()方法比較的是二者的引用位址(即指標)是否相等。很顯然,clsx和clsy是兩個不同的物件,它們在棧的位址是不相等的。如果修改**如下:

classperson clsx = new classperson();

clsx.lastname = "bejaoui";

clsx.firstname = "bechir";

classperson clsy = clsx;

if (clsx.equals(clsy))

else

//this code displays clsx = clsy

由於是直接將clsx賦值給clsy,因此兩個物件的引用位址相等,equals()方法返回true。

其實對於值型別和引用型別的相等性比較,是乙個比較複雜的問題。例如我們可以通過重寫equals()方法增強或修改比較邏輯。重寫equals()方法還必須重寫gethashcode()方法。對於引用型別,還可以使用靜態方法referenceequals()方法。此外,還可以過載操作符==。另外,對於string物件,則比較特殊,因為它使用了immutable模式。雖然string型別是引用型別,但如果直接定義的兩個string物件的值相同,由於採用了immutable模式的原因,這兩個物件其實是同乙個物件,引用位址是相同的。因此不僅動態方法equals()返回的是true,且靜態方法referenceequals()返回的也是true。

C 中的結構與類

c corner 今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?總結起來,兩者共有如下區別 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。...

C 中的結構與類

總結起來,兩者共有如下區別 自 1 結構是值型別,類則是引用型別。因此前者是放在棧 stack 裡,後者則僅僅是將引用位址存放在棧裡,而具體的值則存放在堆 heap 裡。如下圖所示 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。3 類可以被繼承,而結構則不支援...

c 中結構與類的區別

類與結構的差別 如何選擇結構還是類 一 類與結構的示例比較 結構示例 public struct person 類示例 public class testtime 呼叫過程 public class test 從上面的例子中我們可以看到,類的宣告和結構的宣告非常類似,只是限定符後面是 struct ...