1. 程式人生 > >C# struct 裝箱拆箱例子

C# struct 裝箱拆箱例子

值型別:拆箱、裝箱
struct是值型別

struct和class的區別
  1. 類是引用型別,struct是值型別
  2. 在託管堆上建立類的例項,在棧上建立struct例項
  3. 類例項的賦值,賦的是引用地址,struct例項的賦值,賦的是值
  4. 類作為引數型別傳遞,傳遞的是引用地址,struct作為引數型別傳遞,傳遞的是值
  5. 類沒有預設無參建構函式,struct有預設無參建構函式
  6. 類支援繼承,struct不支援繼承
  7. 類偏向於”面向物件”,用於複雜、大型資料,struct偏向於”簡單值”,比如小於16位元組,結構簡單
  8. 類的成員很容易賦初值,很難給struct型別成員賦初值
  9. 類的例項只能通過new SomeClass()來建立,struct型別的例項既可以通過new SomeStruct()來建立,也可以通過SomeStruct myStruct;來建立
// 呼叫方法
private void Form1_Load(object sender, EventArgs e)
{
    Dog dog = new Dog(5);
    object objDog = dog;
    Log.v("5\t" + dog.Power + "/" + ((Dog)objDog).Power);

    // Unbox, modify unboxed value, and discard value
    ((Dog)objDog).SetPower(100);
    Log.v("100\t" + dog.Power + "/" + ((Dog)objDog).Power
+ " - " + ((Dog)objDog).Power); // Box, modify boxed value, and discard reference to box ((IAttack)dog).SetPower(26); Log.v("26\t" + dog.Power + "/" + ((Dog)objDog).Power + " - " + ((Dog)dog).Power); // Modify boxed value directly ((IAttack)objDog).SetPower(58); Log.v("58\t" + dog.Power
+ "/" + ((Dog)objDog).Power + " - " + ((Dog)objDog).Power); }
// 需要的類和介面
// Dog 類
public struct Dog : IAttack
{
    public int Power { get; set; }
    public Dog(int power)
    {
        SetPower(power);
    }
    public void SetPower(int power)
    {
        Power = power;
    }
}
// 攻擊介面
public interface IAttack
{
    void SetPower(int power);
}

輸出結果:

12-29 09:33:46.579   v   5      5/5
12-29 09:33:46.582   v   100    5/5 - 5
12-29 09:33:46.583   v   26     5/5 - 5
12-29 09:33:46.583   v   58     5/58 - 58