|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。上篇文章复杂的谈了谈C#编译器和JIT编译器,原本想接着写范例,对象,线程栈和托管堆在运转时的互相干系的,惋惜解说这部分接纳绘图的体例对照好,以是就先跳过了。
在JAVA中,泛型只被JAVA编译器撑持,其实不被JVM所撑持,也就是说没有界说新的字节码来暗示泛型范例,天然在JVM内里也不会有新的指令来撑持新的字节码。类比到.NET来讲,也就是被C#编译器撑持而不被CLR所撑持。如许就发生了良多风趣的成绩。我们都晓得我们的代码都要经由编译器的翻译修改,JAVA中的泛型就是JAVA编译器接纳范例擦除的体例来完成泛型的。界说的泛型范例,都主动供应了一个响应的原始范例(rawtype)原始范例的名字就是删往范例参数后的泛型名,擦出失落范例变量,并交换为限制范例(无穷定的变量用Object),能够看作是语法糖吧。好比:
publicclassMyHashMap<TKey,TValue>{
privateHashMap<TKey,TValue>m_map=newHashMap<TKey,TValue>();
publicTValueget(TKeykey){
returnthis.m_map.get(key);
}
publicvoidput(TKeykey,TValuevalue){
this.m_map.put(key,value);
}
publicstaticvoidmain(String[]args){
MyHashMap<String,Integer>map=newMyHashMap<String,Integer>();
map.put("Hello",5);
inti=map.get("Hello");
}
}
编译成字节码后,就成了上面这个模样(这里还用JAVA代码来暗示)
- publicclassMyHashMap{privateHashMapm_map=newHashMap();publicObjectget(Objectkey){returnthis.m_map.get(key);}publicvoidput(Objectkey,Objectvalue){this.m_map.put(key,value);}publicstaticvoidmain(String[]args){MyHashMapmap=newMyHashMap();map.put("Hello",5);inti=(Integer)map.get("Hello");}}
复制代码
好吧,看到Object,我供认我又想起装箱了,能够看出Java中的泛型没有办理装箱成绩。
因为JVM其实不晓得泛型范例,以是JAVA中就是以JAVA编译器的语法糖的情势来体现的。现在我刚打仗JAVA的时分,切实其实会被上面几种毛病弄得很狐疑。
publicclassMyClass<SomeType>{
publicstaticvoidmyMethod(Objectitem){
if(iteminstanceofSomeType){//报错
...
}
SomeTypest=newSomeType();//报错
SomeType[]myArray=newSomeType[10];//报错
}
}
在这里我们能够想一下,究竟怎样才算真实的撑持泛型呢?在.NET中,终极是由CLR依据元数据来实行IL代码,因而,能够很简单了解:
1.IL中必定会有一个新指令来辨认“范例参数”。
2.我们晓得范例和办法的界说在元数据表中城市有响应的暗示,因而为了撑持泛型,元数据的格局也会有所修改。
3.修正JIT编译器来实行新的IL指令。
也就是说,泛型范例界说可以完全的编译为MSIL范例。
泛型范例的运转也许的流程以下:
C#编译器天生IL和元数据,暗示泛型类界说,JIT编译器则会把泛型范例界说与一系列的范例参数组合起来。
详细点来讲,IL为初始化某个泛型范例的实例预留了占位符,JIT编译器会在运转的时分,天生呆板代码的时分“补全界说”。JIT把响应的IL代码编译成X86指令,同时优化。优化甚么内容了呢?好比,在范例参数是援用范例的时分,就可以利用不异的呆板代码来暗示。为啥是援用范例而不是值范例呢?由于援用范例基础上都是指针,实质下去讲布局都是一样的。
这里又要谈一下类加载。JIT不是在某个类加载时就为其天生完全的X86指令,而是仅在类中的每一个办法被第一次挪用的时分才入手下手编译的。(我如今以为应当先讲讲范例,对象,线程栈和托管堆在运转时的互相干系对照好)。如许,就会先在IL代码上实行一个占位符交换步骤,交换成详细范例,随后再像一般类一样按需编译。
以前学了大概半年时间的asp(没有机会做大系统,最多是自己对公司系统做些调整和修改还有一些小程序)。应该说开始接触asp.net是今年元月5号的事。现在很想把公司的系统重新用.net来架构,却不知道如何下手。 |
|