Classes and Structs

類別與結構

類別與結構

  • 類別或結構是一種物件的樣板

  • 類別是一種參考型別

    • 在累堆(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

 

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。