首先在介绍c#的时候我们要先理解什么是.NET,.NET就是微软的用来实验XML,Web Services,SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。

Microsoft Windows Server System包括(图1)的内容

            (图1)

  .NET的初级组成是CIL和CLR,CIL是一套运作环境说明,包括一般系统、基础类库和与机器无关的中间代码,全称为通用中间语言(CIL)。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向CLR的所有语言使用。在CIL执行前,CLR必须将指令及时编译转换成原始机械码。

  而我们所说的C#是微软公司发布的一种面向对象的、运行于.NET Farmework之上的由CLR托管的高级程序设计语言。(p.s.按照.NET的说法,在CLR监视之下运行的程序属于“托管的”(managed)代码,而不在CLR之下、直接在裸机上运行的应用或者组件属于“非托管”(unmanaged)的代码。),值得注意的是c#并不能被编译成直接在计算机上执行的二进制代码,虽然和传统的可执行文件一样是.exe后缀,但是如果计算机上没有安装Farmework或者运行的计算机上Farmework版本低于编写程序时使用的版本这些程序将不能执行。

  明白了这些就知道了一点c#的工作原理,要学好c#还要知道一些历史以便在面对市场上各种c#版本方面的书的时候知道自己该选择什么。同时也能明白c#语言里面很多简洁的写法的源头,比如lamda表达式,linq语句等等,这样不会在学习的时候陷入只知其然不知其所以然的尴尬境地。

  c#是微软在2000年发布的一种新的编程语言,起初c#1.X只是一个单纯的面向对象的语言,尽管java宣称是面向对象的,可是面向对象的三个构成结构——方法,属性,事件,java只提供了方法其他两种要通过方法模拟,而c#1.0中所有面向对象的技术得到了很好的体现。另外在这个版本中c#就形成了类类型,值类型和接口类型的类型系统。同时c#1.0中还使用了加法赋值运算符 (+=) 来为事件附加事件处理程序这个过程称为订阅,我将会在以后几章里详细的讲解一下c#如何完成事件的订阅,而且在c#2.0里有更简单的语法去实现它。同时在c#1.0中就引用了委托机制(准确的说应该是CLI提出了委托机制[p.s.委托是一种类型安全的函数指针链表,后面我会用几个篇幅来介绍它])。

  在c#2.X版本中微软提出了范性编程的概念,同时微软发布了visualStudio2005,结合编译器强大的类型推断能力并提出了约束的新概念可以在编译时发现几乎所有的范性危险,而在c#2.X的版本中另外一个不得不说的概念就是匿名方法,用来取代仅出现一次的委托使程序员在写程序的时候能更注重于事件逻辑而不是语言本身,这将开发者带入了函数式编程的领域,匿名方法结合泛型编程这就是lamda语句的前身。在2.X版本中还增强了语言的表达能力比如访问器(get,set)可以有类型修饰符使只可读成为可能。同时还加入了迭代器的概念使程序可以不通过IEnumerator和IEnumerable接口就实现一个可以遍历的类型。

  值得一提的是在这里所说的迭代器并不是在CLI层面上实现的,而是通过编译器自动生成实现了IEnumerator和IEnumerable接口,这似乎体现了微软的某种倾向,果然在c#3.X版本中# 3.0加入了一堆新语法,尤其是在并没有修改CLR的情况下引入了Linq,在我看来这简直就是神来之笔,在linq中使用lamda表达式成了一种自然的选择,(p.s.实际上lamda表达式就是一个匿名的委托,后面的文章里我会向西介绍它)。值得一提的是c#3.X编译生成的IL代码是完全基于.NET2.0的,也就是说这一时期的c#已经离CLI越来越远,更多的工作交给了编译器(比如查询表达式和lamda表达式都不是基于CLI),这个时代的c#已经不再是一个简单的编程语言了,语言继承查询的引入使得那个时候讨论的热门的ORM技术得到了更深入的体现。

  在c#4.0中增加了动态语言的特性,从里面可以看到很多javascript、python这些动态语言的影子。为了实现动态,开发者需要加入dynamic关键字申明一个变量的static类型为dynamic(有点绕口)。这也是c#的一中进化,在3.0及之前,如果你不知道一个变量的类型,而要去调用它的一个方法,一般会用到反射:

 object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
new object[] { , });
int sum = Convert.ToInt32(res);

  有了dynamic,就可以把上面代码简化为:

 dynamic calc = GetCalculator();
int sum = calc.Add(, );

  使用dynamic的好处在于,可以不去关心对象是来源于COM, IronPython, HTML DOM或者反射,只要知道有什么方法可以调用就可以了,剩下的工作可以留给runtime。(这里看不懂没关系,以后我会慢慢讲解这只是以前版本的c#实现的一种简洁进化),动态查找以及命名参数和可选参数这些新特征都有助于使针对COM的编程不再像以前那样的痛苦。这些妙不可言的好处不能在短短几行就分析出来,我会在后期的博文里给大家展现c#4.0编程的优雅,前提是需要对以前版本的c#有一个很好的理解,要不然当你面对那些简单的代码的时候将会有一种无所适从的感觉。

  下一节将会带大家从底层了解一下c#的编码和执行过程。

理解c#的更多相关文章

  1. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  2. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  3. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  6. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  7. ThreadLocal简单理解

    在java开源项目的代码中看到一个类里ThreadLocal的属性: private static ThreadLocal<Boolean> clientMode = new Thread ...

  8. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  9. 深入理解JS 执行细节

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...

  10. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

随机推荐

  1. C语言18个经典问题答录

    原文地址:转载:C语言18个经典问题答录作者:lloo 1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示"非法初始式" 云云. 答:这个声明是静态 ...

  2. 切换根控制器UIApplication 主屏幕UIScreen 读取文件资源NSBundle

    //主屏幕设为webView CGRect frame = [UIScreen mainScreen].applicationFrame; UIWebView *webView = [[[UIWebV ...

  3. go 生成随机小数 指定范围

    package main import ( "crypto/hmac" "crypto/sha1" "encoding/base64" &q ...

  4. LA 3942 - Remember the Word 字典树+DP

    看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  5. JAVA后端实现统一扫码支付:微信篇

    最近做完了一个项目,正好没事做,产品经理就给我安排了一个任务.   做一个像收钱吧这样可以统一扫码收钱的功能.   一开始并不知道是怎么实现的,咨询了好几个朋友,才知道大概的业务流程:先是开一个网页用 ...

  6. Linux下多线程查看工具(pstree、ps、pstack),linux命令之-pstree使用说明, linux 查看线程状态。 不指定

    0.最常用 pstree:[root@iZ25dcp92ckZ temp]# pstree -a|grep multe  |       |   `-multepoolser  |       |   ...

  7. 编译Valgrind arm交叉编译

    1. 下载源码: http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2   2. 加压缩: mkdir sw cd sw tar zxf valgr ...

  8. Mybatis找不到参数错误:There is no getter for property named 'categoryId' in 'class java.lang.Integer'。

    Mybatis找不到参数错误:There is no getter for property named 'categoryId' in 'class java.lang.Integer'. 错误Li ...

  9. 【codeforces 750F】New Year and Finding Roots

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  10. Spring学习笔记之六(数据源的配置)

    1.前言 上一篇博客分析了,Spring中实现AOP的两种动态代理的机制,以下这篇博客.来解说一下Spring中的数据源的配置.  2.DAO支持的模板类 Spring提供了非常多关于Dao支持的模板 ...