【教程】【转载】C#锐利体验(李建忠)—01

教程

C#锐利体验
南京邮电学院 李建忠(cornyfield@263.net)

C#语言是一门简单,现代,优雅,面向对象,类型安全,平台独立的一门新型组件编程语言。其语法风格源自C/C++家族,融合了Visual Basic的高效和C/C++强大,是微软为奠定其下一互联网霸主地位而打造的Microsoft.Net平台的主流语言。其一经推出便以其强大的操作能力,优雅的语法风格,创新的语言特性,第一等的面向组件编程的支持而深受世界各地程序员的好评和喜爱。“它就是我多年来梦寐以求的计算机语言!”--很多资深程序员拿到C#都是这样的惊讶。从C#语言的名字(C Sharp)我们也可见微软用其打造其下一代互联网络深度服务的勃勃雄心。C#语言目前已由微软提交欧洲计算机制造商协会ECMA,经过标准化后的C#将可由任何厂商在任何平台上实现其开发工具及其支持软件,这为C#的发展提供了强大的驱动力,我们也可从这里看到微软前所未有的眼光和智慧。组件编程已经成为当今世界软件业面向下一代程序开发的一致选择,是90年代面向对象编程的深度发展。C#生逢其时,占尽天时地利,“第一等的面向组件编程的支持”也决不是简单说说那么轻松。实际上,组件特性已经深深植入C#语言的各个层面,是为C#锐利(Sharp)之处。在下面的文章中笔者将从C#语言的各个层面来展现C#语言中无处不见的组件特性,深度阐述C#面向组件编程。整个专题共分为十讲:“第一讲 ‘Hello,World!’程序”,“第二讲 C#语言基础介绍”,“第三讲 Microsoft.NET平台基础构造”,“第四讲 类 结构与枚举”,“第五讲 构造器与析构器”,“第六讲 域 方法 属性与索引器”,“第七讲 接口 继承与多态”,“第八讲 委派与事件”,“第九讲 数组与字符串”,“第十讲 特征与映射”,“第十一讲 COM互操作 非托管编程与异常处理”,“第十二讲 用C#编织未来--C#编程模型概述”。第一讲 “Hello,World!”程序“Hello World!”程序是程序员一直以来的一个浪漫约定,也是一个伟大的梦想--总有一天,出自人类之手的计算机会面对这个美丽的世界说一声“Hello World!”。它是学习一门新语言的一个很好的起点,我们就从这里开始,看下面例子:
//HelloWorld.cs by Cornfield,2001
//csc HelloWorld.cs
using System;
class HelloWorld
{
    public static void Main()
    {
        Console.WriteLine("Hello World !");
    }
}
我们可以打开Windows自带的简易的"记事本"程序来编写这段代码--笔者推荐刚开始采用这个极其简单却能把程序代码暴露的相当清晰的编辑工具。我们将它的文件名保存为HelloWorld.cs,其中".cs"是C#源代码文件的扩展名。然后在配置好C#编译器的命令行环境里键入"csc HelloWorld.cs"编译文件。可以看到编译输出文件HelloWorld.exe。我们键入HelloWorld执行这个文件可得到下面的输出:Hello World !下面我们来仔细分析上面的代码和整个程序的编译输出及执行过程。先看文件开始的两行代码,这是C#语言的单行注释语句。和C++语言类似,C#支持两种注释方法:以"//"开始的单行注释和以"/*","*/"配对使用的多行注释。注释之间不能嵌套。再来看下面的"using System;"语句,这是C#语言的using命名空间指示符,这里的"System"是Microsoft.NET系统提供的类库。C#语言没有自己的语言类库,它直接获取Microsoft.NET系统类库。Microsoft.NET类库为我们的编程提供了非常强大的通用功能。该语句使得我们可以用简短的别名"Console"来代替类型"System.Console"。当然using指示符并不是必须的,我们可以用类型的全局名字来获取类型。实际上,using语句采用与否根本不会对C#编译输出的程序有任何影响,它仅仅是简化了较长的命名空间的类型引用方式。接着我们声明并实现了一个含有静态Main()函数的HelloWorld类。C#所有的声明和实现都要放在同一个文件里,不像C++那样可以将两者分离。Main()函数在C#里非常特殊,它是编译器规定的所有可执行程序的入口点。由于其特殊性,对Main()函数我们有以下几条准则:Main()函数必须封装在类或结构里来提供可执行程序的入口点。C#采用了完全的面向对象的编程方式,C#中不可以有像C++那样的全局函数。Main()函数必须为静态函数(static)。这允许C#不必创建实例对象即可运行程序。Main()函数保护级别没有特殊要求, public,protected,private等都可,但一般我们都指定其为public。Main()函数名的第一个字母要大写,否则将不具有入口点的语义。C#是大小写敏感的语言。Main()函数的参数只有两种参数形式:无参数和string 数组表示的命令行参数,即static void Main()或static void Main(string[]args) ,后者接受命令行参数。一个C#程序中只能有一个Main()函数入口点。其他形式的参数不具有入口点语义,C#不推荐通过其他参数形式重载Main()函数,这会引起编译警告。Main()函数返回值只能为void(无类型)或int(整数类型)。其他形式的返回值不具有入口点语义。我们再来看"HelloWorld.cs"程序中Main()函数的内部实现。前面提过,Console是在命名空间System下的一个类,它表示我们通常打交道的控制台。而我们这里是调用其静态方法WriteLine()。如同C++一样,静态方法允许我们直接作用于类而非实例对象。WriteLine()函数接受字符串类型的参数"Hello World !",并把它送入控制台显示。如前所述,C#没有自己的语言类库,它直接获取Microsoft.NET系统类库。我们这里正是通过获取Microsoft.NET系统类库中的System.Console.WriteLine()来完成我们想要的控制台输出操作。这样我们便完成了"Hello World!"程序。但事情远没那么简单!在我们编译输出执行程序的同时,Microsoft.NET底层的诸多机制却在暗地里涌动,要想体验C#的锐利,我们没有理由忽视其背靠的Microsoft.NET平台。实际上如果没有Microsoft.NET平台,我们很难再说C#有何锐利之处。我们先来看我们对"HelloWorld.cs"文件用csc.exe命令编译后发生了什么。是的,我们得到了HelloWorld.exe文件。但那仅仅是事情的表象,实际上那个HelloWorld.exe根本不是一个可执行文件!那它是什么?又为什么能够执行?好的,下面正是回答这些问题的地方。首先,编译输出的HelloWorld.exe是一个由中间语言(IL),元数据(Metadata)和一个额外的被编译器添加的目标平台的标准可执行文件头(比如Win32平台就是加了一个标准Win32可执行文件头)组成的PE(portable executable,可移植执行体)文件,而不是传统的二进制可执行文件--虽然他们有着相同的扩展名。中间语言是一组独立于CPU的指令集,它可以被即时编译器Jitter翻译成目标平台的本地代码。中间语言代码使得所有Microsoft.NET平台的高级语言C#,VB.NET,VC.NET等得以平台独立,以及语言之间实现互操作。元数据是一个内嵌于PE文件的表的集合。元数据描述了代码中的数据类型等一些通用语言运行时(Common Language Runtime)需要在代码执行时知道的信息。元数据使得.NET应用程序代码具备自描述特性,提供了类型安全保障,这在以前需要额外的类型库或接口定义语言(Interface Definition Language,简称IDL)。这样的解释可能还是有点让人困惑,那么我们来实际的解剖一下这个PE文件。我们采用的工具是.NET SDK Beta2自带的ildasm.exe,它可以帮助我们提取PE文件中的有关数据。我们键入命令"ildasm /output:HelloWorld.il HelloWorld.exe",一般可以得到两个输出文件:helloworld.il和helloworld.res。其中后者是提取的资源文件,我们暂且不管,我们来看helloworld.il文件。我们用"记事本"程序打开可以看到元数据和中间语言(IL)代码,由于篇幅关系,我们只将其中的中间语言代码提取出来列于下面,有关元数据的表项我们暂且不谈:class private auto ansi beforefieldinit HelloWorld
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Main() cil managed
  {
    .entrypoint
    // Code size       11 (0xb)
    .maxstack  8
    IL_0000:  ldstr      "Hello World !"
    IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000a:  ret
  } // end of method HelloWorld::Main

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method HelloWorld::.ctor

} // end of class HelloWorld

我们粗略的感受是它很类似于早先的汇编语言,但它具有了对象定义和操作的功能。我们可以看到它定义并实现了一个继承自System.Object 的HelloWorld类及两个函数:Main()和.ctor()。其中.ctor()是HelloWorld类的构造函数,可在"HelloWorld.cs"源代码中我们并没有定义构造函数呀--是的,我们没有定义构造函数,但C#的编译器为我们添加了它。你还可以看到C#编译器也强制HelloWorld类继承System.Object类,虽然这个我们也没有指定。关于这些高级话题我们将在以后的讲座中予以剖析。那么PE文件是怎么执行的呢?下面是一个典型的C#/.NET应用程序的执行过程:用户执行编译器输出的应用程序(PE文件),操作系统载入PE文件,以及其他的DLL(.NET动态连接库)。操作系统装载器根据前面PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到mscoree.dll(.NET平台的核心支持DLL)的_ CorExeMain()函数入口。CorExeMain()函数开始执行PE文件中的中间语言代码。这里的执行的意思是通用语言运行时按照调用的对象方法为单位,用即时编译器将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。程序的执行过程中,垃圾收集器负责内存的分配,释放等管理功能。
程序执行完毕,操作系统卸载应用程序。
清楚的知晓编译输出的PE文件的执行过程是深度掌握C#语言编程的关键,这种过程的本身就诠释着C#语言的高级内核机制以及其背后Microsoft.NET平台种种诡秘的性质。一个"Hello World !"程序的概括力已经足够,在我们对C#语言有了一个很好的起点之后,下面的专题会和大家一起领略C#基础语言,窥探Microsoft.NET平台构造,步步体验C#锐利编程的极乐世界,Let's go! 

时间: 2024-09-09 00:02:53

【教程】【转载】C#锐利体验(李建忠)—01的相关文章

【教程】【转载】C#锐利体验(李建忠)—04

教程  C#锐利体验 第四讲 类与对象[/b] 南京邮电学院 李建忠(cornyfield@263.net) 组件编程不是对传统面向对象的抛弃,相反组件编程正是面向对象编程的深化和发展.类作为面向对象的灵魂在C#语言里有着相当广泛深入的应用,很多非常"Sharp"的组件特性甚至都是直接由类包装而成.对类的深度掌握自然是我们"Sharp XP"重要的一环. 类 C#的类是一种对包括数据成员,函数成员和嵌套类型进行封装的数据结构.其中数据成员可以是常量,域.函数成员可以

【教程】【转载】C#锐利体验(李建忠)—03

教程  C#锐利体验 第三讲 Microsoft.NET平台基础构造 南京邮电学院 李建忠(cornyfield@263.net)抛开Microsoft.NET平台去谈C#是没有意义的,C#之"Sharp"也正在其后端强大的平台.仅仅拘泥于语法层面是体验不了C#的锐利之处的,C#程序很多诡秘之处必须依靠Microsoft.NET平台才能深度的掌握和运用.简单的讲,Microsoft.NET平台是一个建立在开放互联网络协议和标准之上,采用新的工具和服务来满足人们的计算和通信需求的革命性的

【教程】【转载】C#锐利体验(李建忠)—02

教程  第二讲 C#语言基础介绍 南京邮电学院 李建忠(cornyfield@263.net) 在体验C#的锐利之前,关乎语言基本知识的掌握是必不可少的一环.由于C#基本语言很多源自C/C++,在这里对那些和C/C++类似的地方仅作简单介绍,我们将体验专注于那些区别于传统C/C++的关键的语言基础知识. 数据类型 C#语言的数据类型主要分为两类:值类型和引用类型.另外一种数据类型"指针"是为unsafe上下文编程专门设定的,其中unsafe上下文指对代码进行unsafe标示以满足利用指

清华机器学习科学家李建:如何用深度学习来解析时空大数据?

雷锋网AI科技评论按:6月24日下午,钛媒体和杉数科技主办的2017 AI 大师论坛在京举行,论坛邀请了五位算法优化.机器学习领域的顶尖教授.学者出席并发表学术演讲,雷锋网(公众号:雷锋网)记者也对论坛进行了跟踪报道.本篇内容根据机器学习领域专家李建的论坛分享实录整理而成. 李建,清华大学交叉信息研究院助理教授.杉数科技科学家,美国马里兰大学博士.国内机器学习领域最顶尖的前沿科学家之一,国际学术会议VLDB 2009和ESA 2010最佳论文奖获得者,清华211基础研究青年人才支持计划以及教育部

中国建行刘建忠:移动支付带来的变革

12月21日,以"融汇科技创新 开启金融未来"为主题的2012中国国际金融展已进入第二天.在今日的"2012中国金融战略与发展"论坛上,中国建设银行电子银行部副总经理刘建忠发表了主题为"开放 协作 共赢"演讲,介绍了中国建设银行的电子支付服务.498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' width="500" height="4

【教程转载】 火狐浏览器 实用插件一览(附插件下载地址)

[教程转载] 火狐浏览器 实用插件一览(附插件下载地址)简单介绍一下:火狐浏览器(firefox)最大的优点就是安全.快速.稳定.有些人抱怨火狐的功能太少,有些网页不能正常浏览.没关系,这些都不是问题,因为咱们有插件! 重要插件:注意:安装火狐之后可以直接在线安装以下插件,非常方便! MediaWrap :它能够将 ActiveX 控件方式的网页内嵌媒体转换成 Firefox 能够支持的 Plugin 方式,从而使 Firefox 也能够象 IE 一样正常播放 Wmplayer.Rmplayer

IDG李建光:Web2.0的成功需要大批VC赔钱

中介交易 SEO诊断 淘宝客 云主机 技术大厅 新浪科技讯 1月11日消息 IDG VC(技术创业投资基金)合伙人李建光今日上午做客新浪财经中心VC人生,聊天中,他就自己的发展经历.IDG投资策略以及中国WEB2.0的发展现状及趋势与新浪网友做了深入的沟通. 以下是聊天实录: 各位新浪网友,大家好! 主持人:各位网友,大家好!欢迎大家来到新浪财经中心"VC人生"的访谈现场,我是北京电视台的潘槿瑜,今天来到我们演播室的这位嘉宾是IDG合伙人李建光.建光,你好. 李建光:你好,各位网友好.

C#锐利体验(二)

在体验C#的锐利之前,关乎语言基本知识的掌握是必不可少的一环.由于C#基本语言很多源自C/C++,在这里对那些和C/C++类似的地方仅作简单介绍,我们将体验专注于那些区别于传统C/C++的关键的语言基础知识. 数据类型 C#语言的数据类型主要分为两类:值类型和引用类型.另外一种数据类型"指针"是为unsafe上下文编程专门设定的,其中unsafe上下文指对代码进行unsafe标示以满足利用指针对内存直接进行操作要求的C#非托管代码,这些代码将失去Microsoft.NET平台的垃圾收集

C#锐利体验(三)

第三讲 Microsoft.NET平台基础构造 抛开Microsoft.NET平台去谈C#是没有意义的,C#之"Sharp"也正在其后端强大的平台.仅仅拘泥于语法层面是体验不了C#的锐利之处的,C#程序很多诡秘之处必须依靠Microsoft.NET平台才能深度的掌握和运用.简单的讲,Microsoft.NET平台是一个建立在开放互联网络协议和标准之上,采用新的工具和服务来满足人们的计算和通信需求的革命性的新型XML Web智能计算服务平台.它允许应用程序在因特网上方便快捷地互相通信,而