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 ...