C# struct 装箱拆箱例子
原创
©著作权归作者所有:来自51CTO博客作者于大大大洋的原创作品,请联系作者获取转载授权,否则将追究法律责任
值类型:拆箱、装箱
struct是值类型
struct和class的区别
- 类是引用类型,struct是值类型
- 在托管堆上创建类的实例,在栈上创建struct实例
- 类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是值
- 类作为参数类型传递,传递的是引用地址,struct作为参数类型传递,传递的是值
- 类没有默认无参构造函数,struct有默认无参构造函数
- 类支持继承,struct不支持继承
- 类偏向于”面向对象”,用于复杂、大型数据,struct偏向于”简单值”,比如小于16字节,结构简单
- 类的成员很容易赋初值,很难给struct类型成员赋初值
- 类的实例只能通过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