CLI

     “.NET框架是以一种采用系统虚拟机运行的编程平台,以 通用语言运行库(Common Language Runtime)为基础,支持多种语言( C#VB.NETC++Python等)的开发”

     “ 通用语言基础架构Common Language Infrastructure,简称CLI)是一个开放的技术规范 ”

——维基百科

      首先这是两个概念,一切都要从这两个概念开始!(PS:维基百科的专业性与精确性,让我感到佩服,而百度则完全是误导人,请把它当成一个笑话!)

 

      我是一个深深被.NET吸引的准程序员,希望能尽可能的去理解它 更好的使用它。也希望别人尊敬 赞赏它,因为它实在是很美妙!希望别人看到它相对于别的技术的优势。看到它的适用范围。

 

      通过这一年的积累,感觉自己慢慢能够抓住.NET的本质了。虽然自己不成熟,但是感觉还是有不少正确的观点与概念。为了锻炼自己以及表达自己的想法与交流,也为了减少部分人对.NET的认识偏差,能够更好的认识与使用。所以打算发表一系列随笔。(因为是随笔,所以可以毫无顾虑的插入各种东西,这也是相对于书籍它的优点).NET是构建在CLI与CLR(Common Language Runtime)基础上的,这两个系统很有意思,我们可以不用CIL编程,也不需要其它语言,喜欢的话用C#就行了,因为它很好 很强大相对也比较简单。但是理解CIL 元数据 CTS 等这些,可以帮助你能更好的运用.NET平台 ,也可以更好的理解程序的本质,其实任何技术写成的程序在计算机里最后都是变成指令了。我会尽可能的用自己学到的知识和理解来描述这两个极其复杂的系统。

 

      CLI拥有一个强类型系统。它不直接支持任何非强类型的语言。强类型的含义即每一个值都有一个类型,以及只有那个类型允许的操作才能够操作它(这概念其实不好理解,需要积累与体会!)在CLI里常量也是有类型的。

 

      CLI拥有两种类型 值类型与引用类型。你必须认识到这两者类型的差异。否则会带来巨大的性能损失以及一些微妙的bug。很难想象一个对.NET不了解的JAVA  C++程序员可能会干出什么违反.NET编程原则的事情。 每一个值类型的实例代表它的值,而引用类型的实例是一个对它的值的引用。(每一引用类型的实例只有4字节,你对任何实例赋值只会把这4字节传给它,引用的大小与机器有关 32为是4字节) 这是它们两个的本质区别。构造的的时候值类型的实例的内存是被分配在栈上的,只会在方法里出现,是用完既弃的。而引用类型的值是分配在堆里,这里的内存都是受GC(垃圾收集器)管理的。

 

有些必须遵守的法则

      1.每一个值类型都应该不可变的。及一旦初始化之后你不能够再修改。因为C#里的结构体与类看起来相差不大,所以要特别注意!

 

      2.尽可能减少装箱与拆箱。 当我们把值类型作为引用类型使用的时候就会出现装箱,这是极为消耗内存的。.NET1.0没有泛型,当我们使用

集合类存储的时候,都会涉及到装箱。它们会生成值类型的装箱类型,会在堆里分配内存,然后把值拷贝到堆里面。所以不用使用非泛型集合。而是用、

泛型集合去替代。

 

 

  1  using System;
  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 }

 

 

        .NET的编程哲学还有许许多多的内容。 其实要想好好理解运用.NET,我们应该要熟悉CLI与CLR,这是.NET的核心。 这两个东西的变动也是相当小的。基本上从.NET2.0之后就没变过了, 而且这些也是任何CLI系统都差不多的东西。而且熟悉之后对面向对象编程,还有的程序的理解,它是如何变成机器指令的也有相当的认识 。感觉是一本万利的,有了这些再去学习具体的技术也是事半功倍!
 

这些内容主要是依据以下书籍

 

       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部分组成!它以良好的规范,给我们带来强大的功能与方便。

 

 

 

 

       

      

     

 

 

转载于:https://www.cnblogs.com/Okalun/archive/2012/11/27/2787581.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值