若天明 发表于 2015-1-18 11:17:53

ASP.NET教程之入手下手聊聊C#泛型和托付(一)仓酷云

我见过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;//报错
}
}
在这里我们能够想一下,究竟怎样才算真实的撑持泛型呢?在.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来架构,却不知道如何下手。

分手快乐 发表于 2015-1-20 19:48:01

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

冷月葬花魂 发表于 2015-1-29 18:09:01

逐步缩小出错代码段的范围,最终确定错误代码的位置。

第二个灵魂 发表于 2015-2-4 13:21:24

是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。

精灵巫婆 发表于 2015-2-5 20:00:23

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

小魔女 发表于 2015-2-7 13:29:11

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

柔情似水 发表于 2015-2-10 22:40:50

在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?

山那边是海 发表于 2015-3-1 16:51:10

ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。

小女巫 发表于 2015-3-7 00:32:13

能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。

因胸联盟 发表于 2015-3-8 12:21:35

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

若天明 发表于 2015-3-15 22:48:14

现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。
页: [1]
查看完整版本: ASP.NET教程之入手下手聊聊C#泛型和托付(一)仓酷云