不可不知的C#基礎 2. -–從 struct 和 class的異同 說開去
我知道很多人都討論過這個問題, 多我一個不多, 少我一個不少.
最近有人又問到這個問題, 所以想再說說. 萬丈高樓平地起, 地基很重要. 懂了的人不要嫌羅嗦, 歡迎補充或者糾正.
從起源/定義說起
Struct 從C 的時代就已經有了(向丹尼斯.里奇致敬), 它是Structure 的縮寫 -- 就是結構的意思. 它是一種最初級的數據結構, 它包含一到多個相同類型或不同類型的值或者變量. 它就像是一個存儲數據的"包".
Class(類) 是有了面向對象概念之后才有的, 它"是創建對象的藍圖,描述了所創建的對象共同的屬性和方法".
從它們被創立的用途可以看出Class 比Struct 負擔了更大的使命.
類從出生的那天就被賦予了一個偉大的使命: 模擬真實世界的行為, 擁有繼承和多態兩種利器.
Struct 到了C#這個領域中有了一個進化, 它甚至可以實現接口(當然,這個也是C時代沒有的東西), 在本文中會有一個簡單的介紹.
值類型 VS 引用類型
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;
}
}
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 和 class 兩者間該選誰?
我們在編程中要實現某種數據結構時, 絕大部分情況下我們會選擇class -- 因為它的強大和特定的使命. 但是當我們要傳遞或存儲一些小數據結構時,可以考慮struct.
Net framework 下有很多已經定義好了的struct例如:
System.Drawing.Rectangle
System.Drawing.Color
System.Drawing.Point
使用時要記住struct的特性.
本文來自于喜樂的ASP.NET(Alex Song) 轉貼請注明出處



浙公網安備 33010602011771號