類別與結構
類別與結構
-
類別或結構是一種物件的樣板
-
類別是一種參考型別
- 在累堆(heap)分配記憶體
-
結構是一種數值型別
- 在堆疊(stack)分類記憶體
- 不支援繼承
- 不能自訂無參數的建構式
- 成員被自動初始化為0
- 記憶體分配與回收,效率相對高很多
結構
如何定義結構
public struct TheStruct
{
public int x;
public int y;
}
何時要用結構
- 當一個型別僅僅是原始資料集合,不需要複雜的操作,可設計為結構
- 結構邏輯意味著為單一數值
- 可用在密集計算的應用程式
類別
定義一個類別
public class Animal
{
}
類別可被宣告為
- static - 無法被初始化
- abstract - 未完成的類別,需要有子類別完成
- sealed - 無法被繼承的類別
程式碼範例
結構(struct)在堆疊分配記憶體與類別(class)在累堆分配記憶體的差別
/// <summary>
/// 結構
/// </summary>
public struct TheStruct
{
public int x;
}
class Program
{
/// <summary>
/// 改變傳遞過來結構的值
/// </summary>
/// <param name="s">傳遞結構</param>
public static void StructTaker(TheStruct s)
{
// Step 3 : 傳遞過來的是新的struct,並給予新的struct值為5
s.x = 5;
}
static void Main(string[] args)
{
TheStruct st = new TheStruct();
// Step 1 : 賦予初始值
st.x = 1;
// Step 2 : 複製一份新的struct給StructTaker
StructTaker(st);
// Step 4 : 原本的st,沒有被改變,所以輸出為1
Console.WriteLine(st.x); // output : 1
}
}
/// <summary>
/// 類別
/// </summary>
public class TheClass
{
public int x;
}
class Program
{
/// <summary>
/// 改變傳遞過來類別的值
/// </summary>
/// <param name="c">傳遞類別</param>
private static void ClassTaker(TheClass c)
{
// Step 3 : 改變指向參考位址的值
c.x = 5;
}
static void Main(string[] args)
{
TheClass cs = new TheClass();
// Step 1 : 賦予初始值 = 1
cs.x = 1;
// Step 2 : 傳參考位址給ClassTaker
ClassTaker(cs);
// Step 4 : 因為參考位址的值,在ClassTaker被改變了,所以輸出為 5
Console.WriteLine(cs.x); // output : 5
}
}
額外參考:
http://www.dotnetperls.com/struct
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。