我知道很多人都討論過這個問題, 多我一個不多, 少我一個不少.
最近有人又問到這個問題, 所以想再說說. 萬丈高樓平地起, 地基很重要. 懂了的人不要嫌羅嗦, 歡迎補充或者糾正.
從起源/定義說起
Struct 從C 的時代就已經有了(向丹尼斯.裡奇致敬), 它是Structure 的縮寫-- 就是結構的意思. 它是一種最初級的數據結構, 它包含一到多個相同類型或不同類型的值或者變量. 它就像是一個存儲數據的"包".
Class(類) 是有了面向對象概念之後才有的, 它"是創建對象的藍圖,描述了所創建的對象共同的屬性和方法".
從它們被創立的用途可以看出Class 比Struct 負擔了更大的使命.
類從出生的那天就被賦予了一個偉大的使命: 模擬真實世界的行為, 擁有繼承和多態兩種利器.
Struct 到了C#這個領域中有了一個進化, 它甚至可以實現接口(當然,這個也是C時代沒有的東西), 在本文中會有一個簡單的介紹.
值類型VS 引用類型
在.net 世界中, System.Object "支持.NET Framework 類層次結構中的所有類,並為派生類提供低級別服務。 這是.NET Framework 中所有類的最終基類;它是類型層次結構的根。" 從Object再衍生出所有類、結構、枚舉和委托。
看看下面這個圖對net中兩大類型的描述, -- 當然還有一種"指針類型",在這裡我們不予討論.
Struct 是屬於值類型這個陣容, 而所有class 都是引用類型.
這意味著什麼?
當我們使用等號"賦值"時, 對於Struct而言就是將同樣的值復制給另一個變量; 而對於Class而言就只是將它們的名字指向同一個對象.
看下面的實例:
class FooClass
{
public int FooValue;
}
struct FooStruct
{
public int FooValue;
}
class Program
{
static void Main(string[] args)
{
FooClass classObj = new FooClass();
classObj.FooValue = 0;
FooClass classObj2 = classObj;
classObj2.FooValue = 1;
FooStruct structObj = new FooStruct();
structObj.FooValue = 0;
FooStruct structObj2 = structObj;
structObj2.FooValue = 1;
}
}
再最後設個斷點, 運行後取值:
structObj2 在初始時, 會創建一個全新的副本, 然後獲取structObj 的所有數值;
classObj2 在初始時, 只是指向了classObj. 這就是值類型和引用類型的一個區別. 當修改classObj 或者classObj2 時, 修改的是同一部分內存.
Struct實現接口
前面提到了Struct可以實現接口, 下面我們引用一個實例:
interface IPromotion
{
void promote();
}
struct Employee : IPromotion
{
public string Name;
public int JobGrade;
public void promote()
{
JobGrade++;
}
public Employee(string name, int jobGrade)
{
this.Name = name;
this.JobGrade = jobGrade;
}
public override string ToString()
{
return string.Format("{0} ({1})", Name, JobGrade);
}
}
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee("Cool Guy", 65);
IPromotion p = employee;
Console.WriteLine(employee);
p.promote();
Console.WriteLine(employee);
}
}
一旦增加了這個功能, 我們就可以在應用Struct之前, 給予其一些接口的定義. 使一類的struct 在形式上保持一致.
不同的用途
使用中在struct 和class 兩者間該選誰?
我們在編程中要實現某種數據結構時, 絕大部分情況下我們會選擇class -- 因為它的強大和特定的使命. 但是當我們要傳遞或存儲一些小數據結構時,可以考慮struct.
Net framework 下有很多已經定義好了的struct例如:
System.Drawing.Rectangle
System.Drawing.Color
System.Drawing.Point
使用時要記住struct的特性.
本文來自於喜樂的ASP.NET(Alex Song) 轉貼請注明出處