“ 通用语言基础架构(Common Language Infrastructure,简称CLI)是一个开放的技术规范 ”
——维基百科
首先这是两个概念,一切都要从这两个概念开始!(PS:维基百科的专业性与精确性,让我感到佩服,而百度则完全是误导人,请把它当成一个笑话!)
我是一个深深被.NET吸引的准程序员,希望能尽可能的去理解它 更好的使用它。也希望别人尊敬 赞赏它,因为它实在是很美妙!希望别人看到它相对于别的技术的优势。看到它的适用范围。
通过这一年的积累,感觉自己慢慢能够抓住.NET的本质了。虽然自己不成熟,但是感觉还是有不少正确的观点与概念。为了锻炼自己以及表达自己的想法与交流,也为了减少部分人对.NET的认识偏差,能够更好的认识与使用。所以打算发表一系列随笔。(因为是随笔,所以可以毫无顾虑的插入各种东西,这也是相对于书籍它的优点).NET是构建在CLI与CLR(Common Language Runtime)基础上的,这两个系统很有意思,我们可以不用CIL编程,也不需要其它语言,喜欢的话用C#就行了,因为它很好 很强大相对也比较简单。但是理解CIL 元数据 CTS 等这些,可以帮助你能更好的运用.NET平台 ,也可以更好的理解程序的本质,其实任何技术写成的程序在计算机里最后都是变成指令了。我会尽可能的用自己学到的知识和理解来描述这两个极其复杂的系统。
CLI拥有一个强类型系统。它不直接支持任何非强类型的语言。强类型的含义即每一个值都有一个类型,以及只有那个类型允许的操作才能够操作它(这概念其实不好理解,需要积累与体会!)在CLI里常量也是有类型的。
有些必须遵守的法则
1.每一个值类型都应该不可变的。及一旦初始化之后你不能够再修改。因为C#里的结构体与类看起来相差不大,所以要特别注意!
2.尽可能减少装箱与拆箱。 当我们把值类型作为引用类型使用的时候就会出现装箱,这是极为消耗内存的。.NET1.0没有泛型,当我们使用
集合类存储的时候,都会涉及到装箱。它们会生成值类型的装箱类型,会在堆里分配内存,然后把值拷贝到堆里面。所以不用使用非泛型集合。而是用、
泛型集合去替代。
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace VauleAndRef
7 {
8 public struct BadPiont
9 {
10 private int _x;
11
12 public int X
13 {
14 get { return _x; }
15 set { _x = value; }
16 }
17 private int _y;
18
19 public int Y
20 {
21 get { return _y; }
22 set { _y = value; }
23 }
24
25 public BadPiont( int x, int y)
26 {
27 _x = x;
28 _y = y;
29 }
30 public override string ToString()
31 {
32 return String.Format( " {{ x={0},y={1} }} ",_x.ToString(),_y.ToString());
33 }
34
35 }
36 public struct GoodPiont
37 {
38 private int _x;
39
40 public int X
41 {
42 get { return _x; }
43 private set { _x = value; }
44 }
45 private int _y;
46
47 public int Y
48 {
49 get { return _y; }
50 private set { _y = value; }
51 }
52
53 public GoodPiont( int x, int y)
54 {
55 _x = x;
56 _y = y;
57 }
58
59 public override string ToString()
60 {
61 return string.Format( " {{ x={0},y={1} }} ", _x, _y);
62 }
63 // 这里的方法比下面的方法要差一些,因为String.Format还有WriteLine。的参数是Object所以
64 // 直接使用会造成值类型会造成装箱。
65
66 // 这是直接使用值类型做参数,当然如果要是使用格式化参数N那么就不用用这种形式
67 // 在这里两者的区别不是很大,效果也很微妙,不过这样也提醒我们装箱是无处不再的。
68 // IL_0007: ldfld int32 VauleAndRef.GoodPiont::_x
69 // IL_000c: box [mscorlib]System.Int32
70 // IL_0011: ldarg.0
71 // IL_0012: ldfld int32 VauleAndRef.GoodPiont::_y
72 // IL_0017: box [mscorlib]System.Int32 //这就是装箱指令,很多IL指令都会涉及到元数据的访问与操作。CIL是很有趣的中间语言
73 // IL_001c: call string [mscorlib]System.String::Format(string,
74 // object,
75 // object)
76 // 这是用ToString。
77 // IL_0007: ldflda int32 VauleAndRef.BadPiont::_x
78 // IL_000c: call instance string [mscorlib]System.Int32::ToString()
79 // IL_0011: ldarg.0
80 // IL_0012: ldflda int32 VauleAndRef.BadPiont::_y
81 // IL_0017: call instance string [mscorlib]System.Int32::ToString()
82 // IL_001c: call string [mscorlib]System.String::Format(string,
83 // object,
84 // object)
85
86
87 // public override string ToString()
88 // {
89 // return String.Format("{{ x={0},y={1} }}", _x.ToString(), _y.ToString());
90 // }
91
92 }
93 class Program
94 {
95 static void Main( string[] args)
96 {
97 StructSample();
98 }
99
100 private static void StructSample()
101 {
102 int x= 10;
103 int y = 11;
104 BadPiont bp = new BadPiont(x, y);
105 Console.WriteLine(bp);
106 bp.X = 1; // 在这里生成了一个新的值,原来的 bp会变成内存垃圾。所以应该用类代替。
107 Console.WriteLine(bp);
108
109 GoodPiont gp= new GoodPiont(x,y);
110 // gp.X = 11; 这里编译不能通过,因为它是不可变的,构建之后你无法再去修改它,这样就避免了不必要的性能损失。
111 Console.WriteLine(gp);
112 }
113 }
114 }
这些内容主要是依据以下书籍
1 Ecma-334 C# Language specification
2 Ecma-335 Common Language Infrastructure
3 .NET探秘—MSIL权威指南
4 .NET本质论 第一卷:公共语言运行库
5 .NET设计规范 2
6. Effective C#中文版
7. More Effective C#中文版
I Common Language Infrastructure
Common Language Infrastructure 简称CLI,是一组规范。“可执行码以及代码的运行时环境的规范,它定义了一个语言无关的跨体系结构的运行环境”(维基)
它是软件发展史上的一个里程碑!它是未来技术的发展方向!是程序员的最重要的法宝!因为只要遵守规范,你可以用任何语言 在任何平台上运行。而且CLI本身也是
相当清晰的,容易理解的! (有时我会把CLI与实现CLI的系统当成一个东西,而不会把实现CLI的系统用.NET去替代。因为让所有人明白这两者的区别就是这些随笔的目标之一)
有人说开源是软件技术发展方向。我个人感觉开源是有缺点的,需要谨慎。如果没有良好的规范,只会导致混乱。现在JAVA就挺混乱的
,2010年10月编程语言排行榜:Java的混乱之治(1) 。(编程语言排行榜)这篇文章应该能让人很清晰感觉到。这种混乱只会加大程序员的学习负担。
而实现CLI的平台,你可以毫无顾虑的使用BCL和各种语言。这真的很爽! 而且托管程序都能很轻易的反汇编成语言。不知道这和开源有什么区别与联系。(感觉
不是一个东西 )。
CLI是支持面向对象编程的。这是由它的元数据系统保准的,(以前自己就没有好好思考过,面向对象是怎么实现的) 它的系统能够保证大多数应该场景!
可能只是那种对性能有极端要求的以及非常底层的操作。我们才需要汇编 C C++。当然还有别的特殊领域。而基于CLI的系统能解决大部分的场景。现在.NET能做的事就很多
,JAVA能做的事也不少。从理论上讲JAVA能做的事,也能通过实现CLI来做!CLI能在任何操作系统被支持。不论是移动 还是平板电脑。只要JAVA能用的平台,CLI也能支持。
CLI为我们提供了一个安全的系统。它有成千上万的安全措施。如果出现安全问题基本上都是程序员的问题! 一个良好的软件是不会给黑客留给任何安全漏洞
。的是无法制造它比C C++安全许多。CLI还有各种各样的优势!
CLI由以下6部分组成!它以良好的规范,给我们带来强大的功能与方便。