1:Box 装箱(值类型Value-Type转成引用类型Reference-Type)
2:UnBox拆箱
3: Collections 普通集合
4: Generic 泛型集合
一:vs中打开IL Dasm反编译工具的方法:工具—外部工具-添加
标题:IL Dasm
命令和初始目录填写IL的路径C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ILDASM.EXE
参数填写: $(ProjectDir)bin\Debug\$(TargetName)$(TargetExt)
二: 例子1:装拆箱
int i = 123;
object o = i;//第1次装箱
i = 456;
Console.WriteLine(i +//第2次装箱
"and" +
(int)o//第3次装箱,然后第一次拆箱);
分析:用到字符串连接符”+”,将调用String.Concat
(连接string字符串的多个实例的静态方法)
这个例子中将连接2个int和一个string,所以重载列表中最匹配的方法是string.concat(o,o,o).第一个实例i是int类型,转成object类型,进行了一次装箱操作.”and”是string,string本身是引用类型.第3个实例(int)o是值类型,同理进行一次装箱操作.优化方法如下
int i = 123;
object o = i;//只有1次装箱操作
i = 456;
Console.WriteLine(i.tostring() +//无装箱,string类型是一个引用类型
"and" +
o//无装拆箱);
例子2:普通类型和泛型
//结构Person
struct Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
set { name = value; }
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person("jason");
//普通集合版本
ArrayList arr = new ArrayList();
arr.Add(p);//加入到集合,装箱操作
Console.WriteLine(((Person)arr[0]).Name);//访问集合元素先拆箱
//泛型集合版本
List<Person> list = new List<Person>();
list.Add(p);
Console.WriteLine(list[0].Name);
}
}