您好,欢迎访问一九零五行业门户网

C#基础知识整理 基础知识(19) 值类型的装箱和拆箱(二)

如果代码中会造成编译器的反复装箱,可改为手动装箱,这样来使代码执行更快,看下面代码:
//手动装箱 int32 v = 5; //由于string.format的参数是object类型,所以这里会造成三次装箱。 console.writeline(string.format("{0},{1},{2}", v, v, v)); //修改一下,当然这只是一个小技巧,比如程序中对同一个值的同一个操作执行多次, //应该都是要先执行一次,然后再使用的。 object o = v;//装箱一次 console.writeline(string.format("{0},{1},{2}", o, o, o));
通过前面的代码段,我们再写程序时就很容易判断什么时候值类型要装箱。无非就是当要获取一个值类型的引用时,就要装箱。这里也很清楚的可以看出值类型与引用类型的区别:
1、值类型不在托管堆中分配空间;而引用类型在实例化后就在堆上分配了类中指定的成员的的空间。
2、值类型没有堆上的对象的额外成员,即“类型对象指针”、“同步索引”。
未装箱的值类型没有同步索引,因此不能使用该类型所在类的方法(比如lock)让多个线程同步对这个实例的访问。
虽然未装箱的值类型没有类型对象指针,但仍可调用由类型继承或重写的虚方法,比如equals,gethashcode,tostring。如果值类型重写了其中任何一个虚方法,那么clr可以非虚地调用该方法,因为值类型是隐式密封的,没有任何类型能够从它派生。此外,用于调用虚方法的值类型实例不会被装箱。如果重写的虚方法要调用方法在基类中的实现,那么在调用基类的实现时,值类型实例会装箱。因为这些方法是有system.object定义的,所以这些方法期望this实参是指向堆上的一个对象的指针。
此外,将值类型的一个未装箱实例转型为类型的某个接口是,要求实例进行装箱。因为接口变量必须包含对堆上的一个对象的引用。看下面代码:
class program { static void main(string[] args) { point p1 = new point(10, 10); point p2 = new point(20, 20); //调用tostring不装箱,这里tostring是一个虚方法 console.writeline(p1.tostring()); //gettype是一个非虚方法,p1要装箱 console.writeline(p1.gettype()); //这里调用的是public int compareto(point p) //p2不会装箱 console.writeline(p1.compareto(p2)); //p1要装箱,这就是将未装箱的值类型转为类型的某个接口时 icomparable c = p1; console.writeline(c.gettype()); //这里调用的是public int32 compareto(object o), //而且c本来就是一个引用,因此不装箱了 console.writeline(p1.compareto(c)); //这里调用的是c的compareto方法,参数是object型的 //所以要对p2装箱 console.writeline(c.compareto(p2)); //对c拆箱,并复制值到p2中 p2 = (point)c; console.writeline(p2.tostring()); } } internal struct point : icomparable { private int32 x; private int32 y; public point(int32 x, int32 y) { this.x = x; this.y = y; } public override string tostring() { return string.format("{0},{1}", x, y);//这里装箱两次,不知道有没好办法。 } public int compareto(point p) { return math.sign(math.sqrt(x * x + y * y) - math.sqrt(p.x * p.x + p.y * p.y)); } public int32 compareto(object o) { if (gettype() != o.gettype()) { throw new argumentexception("o is not point."); } return compareto((point)o); } }
以上就是c#基础知识整理 基础知识(19) 值类型的装箱和拆箱(二)的内容。
其它类似信息

推荐信息