代码改变世界

.NET3.5 发展的背后

2008-03-01 11:03  Franz  阅读(471)  评论(1编辑  收藏  举报
本文不是想解释微软内部关于.NET发展的内幕,而是想从CLR层面窥视一下.NET的发展.任何的语言从开始出生到真正的茁壮青年都在发生着一些变化,有时候变化是轰轰烈烈的.如果对.NET认识比较早的朋友应该还记在.NET1.1的时候和java有相当大的相似性,无论从类的设计上还是语法的模式上,可能小孩子出生时就是长的差不多,很难看的出谁更帅.也因为比较谁长的更帅.java的fans们和.net的fans们相互扔着砖头准备把另一个孩子打死.
很庆幸.这两个孩子都没有死.他们现在在比着谁最先能成熟,或许希望成熟的把那个不成熟的给打死吧.
ok,言归正传,我们接下来我将在以后的文章中一步步的给朋友们介绍.net3.5带给了我们什么!
今天我们来看第一个简单的小变化.隐式类型化局部变量(或简称为 var),它负责指示编译器推断局部变量的类型。例如:var integer = 1;
看这个背后变化了什么?
class Program
    
{
        
static void Main(string[] args)
        
{
            var inferint 
= 2;
            
int clear = 4;

            var inferStr 
= "Hello";
            
string clearStr = "Cuiwf";
        }

    }
对它进行编译后,可以通过ildasm来查看它在il层次的情况.具体的如下
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  
// Code size       18 (0x12)
  .maxstack  1
  .locals init ([
0] int32 inferint,
           [
1] int32 clear,
           [
2string inferStr,
           [
3string clearStr)
  IL_0000:  nop
  IL_0001:  ldc.i4.
2
  IL_0002:  stloc.
0
  IL_0003:  ldc.i4.
4
  IL_0004:  stloc.
1
  IL_0005:  ldstr      
"Hello"
  IL_000a:  stloc.
2
  IL_000b:  ldstr      
"Cuiwf"
  IL_0010:  stloc.
3
  IL_0011:  ret
}
 // end of method Program::Main


通过这个可以看出在il上已经看不到我们的那个var的踪影了.摇身一变变成了相应的类型.我们由此可以推断出来相应的这个语言的机制对il层来说它还不知道.在进行第一次编译的时候已经被作了相应的推断.为我们服务的.net编译器成长的更加智能化.能根据我们的右边的类型进行智能的推断.
在这里提示大家一点注意的问题.
var inferint = 2;
inferint 
= 3.5;
友好的编译器会很生气的告诉你这样做是不对的.因为inferint在第一句中已经被推断为int类型了.接下来它将以int类型存在着.你给它个3.5它发现多了个小数点.因此它很生气,后果就是不让你通过编译.
可能有朋友就是想让它一开始就不想让inferint是int类型,那就请您在一开始给它一个小数点吧
            var inferint = 2.0;
            inferint 
= 3.5;
编译器会很高兴的通过您的编译.

可能您会问为什么不直接写出他们的类型呢?
这个问题好,这个正是为什么我们要用这个的道理.它带给我们的好处.
            var p1 = new { Name = "zhangsan", Age = 24 };
            var p2 
= new { Name = "lisi", Age = 12 };
(此处已经修订,第一次写的那个例子不恰当,谢谢这位网友)
这个例子就充分的看出来好处了吧!动态的推断自己的类型,因为这个的名字是隐藏的(关于匿名类我将在以后详细的介绍),有时候我们只是需要这种轻量级的类来展示我们的数据或逻辑.当然我们可以根据这个做您想作的东西.可能您现在想不出来能用在那里.但是当您遇到这样的问题请您想到有这么个东西!
好了,今天就到这里.
欢迎继续关注我的bolg中的后续内容!