【IT168技术文档】
转载自Jeff Zhao的博客
老赵一直建议大家不要倾向于学习IL的原因有二:
IL能够说明的内容太少,包括大部分.NET“必知必会”。
IL能够获得的信息从高级语言中也大都可以知道。
而这篇文章便是希望通过实例来把第1点解释清楚,而第2点则留给下一篇文章来解释。
在文章开始之前,老赵先要承认两个错误:
首先,上一篇文章对于“IL”和“汇编”的阐述还有些混淆。在这方面某些朋友给出了一些更确切地说法,IL是一种为.NET平台设计的汇编语言,拥有大量.NET平台中特有的高级特性。而x86汇编等则是与机器码一一对应的文字形式代码。不过为了方便表述,在这一系列文章中,还是以“IL”来指代.NET平台上的中间语言,以“汇编”来指代x86汇编这种和特定CPU平台紧密相关的事物——包括之前那篇文章,其实是在阐述IL和汇编之间的关系和区别,以及该如何对待它们的问题,而并非为IL是否可以被叫做是“汇编”进行争论。
其次,在第1篇文章发布的时候,现在这篇文章,也就是本系列第2篇的标题是“汇编可以看到太多IL看不到的东西”。不过后来在半夜重读这篇文章,并且仔细整理这篇文章的示例时发现出了一个问题——我并不是在讲汇编,要探索CLR中的各种问题也并不是仅仅靠汇编来发现的。当时写文章的时候谈了太多的IL和汇编,最终把自己的思路也给绕了进去。现已修改,希望没有给朋友们造成误解,抱歉。今后老赵也会尽量避免此类情况发生。
好了,现在开始继续我们这次的话题。
既然是讨论IL,自然要讨论IL可以做什么,这样才能够以此得出IL究竟该不该学,如果该学的话有应该怎么学——这话当然是对你,我,他个人来说的,不可一概而论。不过也有一个东西需要了解的,就是IL到底表达出了什么,IL又没有表达出什么东西。
在这里继续强调一下上文的结论:无论IL是否算是一种“汇编”,都不影响它是一种非常高级的编程语言,拥有各种高级特性,例如泛型、引用类型,值类型,方法属性等等,这些特性才是我们判断的依据,而不是它是否能够被冠上“汇编”的“称号”。简单地说,我们应该看它“能(或不能)做什么”,而不是它“能(或不能)被叫做什么”。以下就通过几个示例来展示一些情况:
示例一:探究泛型在某些情况下的性能问题
为了契合本文的内容,也为了说明问题,老赵先举一个例子,那正是在《从汇编入手,探究泛型的性能问题》一文中使用过的例子:
namespace TestConsole
{
public class MyArrayList
{
public MyArrayList(int length)
{
this.m_items = new object[length];
}
private object[] m_items;
public object this[int index]
{
[MethodImpl(MethodImplOptions.NoInlining)]
get
{
return this.m_items[index];
}
[MethodImpl(MethodImplOptions.NoInlining)]
set
{
this.m_items[index] = value;
}
}
}
public class MyList<T>
{
public MyList(int length)
{
this.m_items = new T[length];
}
private T[] m_items;
public T this[int index]
{
[MethodImpl(MethodImplOptions.NoInlining)]
get
{
return this.m_items[index];
}
[MethodImpl(MethodImplOptions.NoInlining)]
set
{
this.m_items[index] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
MyArrayList arrayList = new MyArrayList(1);
arrayList[0] = arrayList[0] ?? new object();
MyList<object> list = new MyList<object>(1);
list[0] = list[0] ?? new object();
Console.WriteLine("Here comes the testing code.");
var a = arrayList[0];
var b = list[0];
Console.ReadLine();
}
}
}