.NET3.5 发展的背后
2008-03-01 11:03 Franz 阅读(475) 评论(1) 编辑 收藏 举报
本文不是想解释微软内部关于.NET发展的内幕,而是想从CLR层面窥视一下.NET的发展.任何的语言从开始出生到真正的茁壮青年都在发生着一些变化,有时候变化是轰轰烈烈的.如果对.NET认识比较早的朋友应该还记在.NET1.1的时候和java有相当大的相似性,无论从类的设计上还是语法的模式上,可能小孩子出生时就是长的差不多,很难看的出谁更帅.也因为比较谁长的更帅.java的fans们和.net的fans们相互扔着砖头准备把另一个孩子打死.
很庆幸.这两个孩子都没有死.他们现在在比着谁最先能成熟,或许希望成熟的把那个不成熟的给打死吧.
ok,言归正传,我们接下来我将在以后的文章中一步步的给朋友们介绍.net3.5带给了我们什么!
今天我们来看第一个简单的小变化.隐式类型化局部变量(或简称为 var),它负责指示编译器推断局部变量的类型。例如:var integer = 1;
看这个背后变化了什么?
通过这个可以看出在il上已经看不到我们的那个var的踪影了.摇身一变变成了相应的类型.我们由此可以推断出来相应的这个语言的机制对il层来说它还不知道.在进行第一次编译的时候已经被作了相应的推断.为我们服务的.net编译器成长的更加智能化.能根据我们的右边的类型进行智能的推断.
在这里提示大家一点注意的问题.
可能有朋友就是想让它一开始就不想让inferint是int类型,那就请您在一开始给它一个小数点吧
可能您会问为什么不直接写出他们的类型呢?
这个问题好,这个正是为什么我们要用这个的道理.它带给我们的好处.
这个例子就充分的看出来好处了吧!动态的推断自己的类型,因为这个的名字是隐藏的(关于匿名类我将在以后详细的介绍),有时候我们只是需要这种轻量级的类来展示我们的数据或逻辑.当然我们可以根据这个做您想作的东西.可能您现在想不出来能用在那里.但是当您遇到这样的问题请您想到有这么个东西!
好了,今天就到这里.
欢迎继续关注我的bolg中的后续内容!
很庆幸.这两个孩子都没有死.他们现在在比着谁最先能成熟,或许希望成熟的把那个不成熟的给打死吧.
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层次的情况.具体的如下{
static void Main(string[] args)
{
var inferint = 2;
int clear = 4;
var inferStr = "Hello";
string clearStr = "Cuiwf";
}
}
.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,
[2] string inferStr,
[3] string 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
{
.entrypoint
// Code size 18 (0x12)
.maxstack 1
.locals init ([0] int32 inferint,
[1] int32 clear,
[2] string inferStr,
[3] string 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 = 3.5;
可能有朋友就是想让它一开始就不想让inferint是int类型,那就请您在一开始给它一个小数点吧
var inferint = 2.0;
inferint = 3.5;
编译器会很高兴的通过您的编译.inferint = 3.5;
可能您会问为什么不直接写出他们的类型呢?
这个问题好,这个正是为什么我们要用这个的道理.它带给我们的好处.
var p1 = new { Name = "zhangsan", Age = 24 };
var p2 = new { Name = "lisi", Age = 12 };
(此处已经修订,第一次写的那个例子不恰当,谢谢这位网友)var p2 = new { Name = "lisi", Age = 12 };
这个例子就充分的看出来好处了吧!动态的推断自己的类型,因为这个的名字是隐藏的(关于匿名类我将在以后详细的介绍),有时候我们只是需要这种轻量级的类来展示我们的数据或逻辑.当然我们可以根据这个做您想作的东西.可能您现在想不出来能用在那里.但是当您遇到这样的问题请您想到有这么个东西!
好了,今天就到这里.
欢迎继续关注我的bolg中的后续内容!