總結起來,結構與類別主要有以下差異:
null。abstract。object 類型的以下方法:Equals()、GetHashCode()、GetType()、ToString()。若要讓結構具有多型特性,可讓其實作介面。volatile 欄位。volatile 主要用於平行處理,相當於方法主體的 lock。sizeof,對類別則不行。System.Object.Equals() 體現不同。結構為實值類型,Equals() 比較兩物件值是否相等;類別為參考類型,Equals() 比較兩者參考位址(指標)是否相等。struct Me {
private Me() // compile-time error
{ }
}
class Me {
private Me() // runs Ok
{ }
}
struct myStructure {
static myStructure() {
Console.WriteLine("This is me a structure");
}
}
class myClass {
static myClass() {
Console.WriteLine("This is me a class");
}
}
class Program {
static void Main(string[] args) {
myStructure s = new myStructure(); // Nothing happen
myClass c = new myClass(); // Will output "This is me a class"
Console.Read();
}
}
struct myStructure {
public string x = 2; // Not allowed
}
class myClass {
public string x = 2; // Allowed
}
struct StructurePerson {
public string FirstName;
public string LastName;
}
class ClassPerson {
public string FirstName;
public string LastName;
}
// 測試程式碼
StructurePerson strX = new StructurePerson();
strX.LastName = "Bejaoui";
strX.FirstName = "Bechir";
StructurePerson strY = new StructurePerson();
strY.LastName = "Bejaoui";
strY.FirstName = "Bechir";
if (strX.Equals(strY))
Console.WriteLine("strX = strY"); // 顯示此行
else
Console.WriteLine("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))
Console.WriteLine("clsX = clsY");
else
Console.WriteLine("clsX != clsY"); // 顯示此行
由於結構是實值類型,Equals() 比較值是否相等;類別是參考類型,Equals() 比較參考位址。clsX 與 clsY 是兩個不同物件,堆疊位址不相等。若修改程式碼:ClassPerson clsY = clsX; 直接指派,則兩物件參考位址相等,Equals() 回傳 true。
實值類型與參考類型相等性比較是複雜問題。可透過覆寫 Equals() 增強或修改比較邏輯,覆寫 Equals() 還必須覆寫 GetHashCode()。參考類型還可使用靜態方法 ReferenceEquals()。也可多載 == 運算子。String 物件特殊,因使用 Immutable 模式。雖然 String 是參考類型,但直接定義兩個值相同的 String 物件,因採用 Immutable 模式,這兩物件其實是同一物件,參考位址相同,不僅 Equals() 回傳 true,ReferenceEquals() 也回傳 true。