1.如下这段代码会经历装箱和拆箱。例如25会先装箱成object后传递给writeline方法(一次拷贝),在方法内部又
经历拆箱成int(第二次拷贝)后然后调用tostring().
Console.WriteLine("A few numbers:{0}, {1}, {2}", 25, 32, 50);
所以建议这种写法:只经历一次装箱
Console.WriteLine("A few numbers:{0}, {1}, {2}", 25.ToString(), 32.ToString(), 50.ToString());
规则一:隐式需要object'类型时,值类型先装箱。
2.在使用.Net 1.x的集合时,当你添加一个值类型数据到集合时中,你就创建了一个箱子。任何时候从集合中移出一个对象时,你得到的是箱子里的一个拷贝。
struct Person {........} // Using the Person in a collection: ArrayList attendees = new ArrayList( ); Person p = new Person( "Old Name" ); attendees.Add( p ); // Try to change the name: Would work if Person was a reference type. Person p2 = (( Person )attendees[ 0 ] ); p2.Name = "New Name"; // Writes "Old Name": Console.WriteLine( attendees[ 0 ].ToString( ));
此段代码有3处拷贝。Person是一个值类型数据,在存储到ArrayList之前它被装箱。这会产生一个拷贝。而在移出的Persone对象上通过访问属性做一些修改时,另一个拷贝被创建。而你所做的修改只是针对拷贝,而实际上还有第三个拷贝通过ToString()方法来访问attendees[0]中的对象。