c#学习笔记(4)_c#教程

2008-02-23 05:46:49来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

约定

//一个典型的用C#写就的HelloWorld程式
using System;
class HelloWorld
{
public static void Main()
{
Console.WriteLine("Hello World !");
}
}

我忘记自己第一次用C#向世界问好是在什么时候了,但是能够肯定我已打过招呼了,那时候用的是beta1版。现在您能够到http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml去下载.Net Framework Software Development Kit (SDK)的正式版,其中包括了前面提到的.NET Framework, 连同书写、编译、测试、研发 .NET Framework 应用程式所需要的一切——文档、例子、命令行工具和编译器。安装之后就能够研发和运行C#程式了,但是一般的建议是:一定要看.Net Framework SDK中所带的文档和例子,假如能照着例子再写一遍那就再好但是了。
当我第一次看到C#代码的时候,同样认为他很像Java,一个形象的比喻是:C#和Java是一对双胞胎,从语法的角度来讲,他们一起的父亲当然非C 莫属(请注意,不是VC )。对于一个学过Java语言的人来说(比如说在下),要理解这段代码实在是太容易了:第一行当然是注释了,C#支持两种注释方法,以"//"开始的单行注释和以"/*"、"*/"配对使用的多行注释。第二行(using System)导入了System这个包(在C#中被称之为名字空间,Namespace),能够让我们方便的调用Microsoft.Net基类库System中的任何类,在此例中使用了System名字空间中的"Console"类,用于在控制台窗口输出程式运行结果。如前所述,C#并没有内置的输入输出语句,任何需实现的功能都完全来自于.Net基类库。这一句的作用就是告诉编译器去哪里寻找Console类以便调用。
接下来声明了一个类HelloWorld,这个类中有一个特别的方法Main(),每个可执行文档都需要有一个入口点,在C#中,这个入口点就是Main()方法,此方法将在程式启动时被调用。在这个方法中,Console是在命名空间System下的一个类,他表示的是控制台。这里调用其静态方法WriteLine()。如同C 相同,静态方法允许我们直接作用于类而非实例对象。WriteLine()函数接受字符串类型的参数"Hello World !",并把他送入控制台显示。如前所述,C#没有自己的类库,他直接获取Microsoft.NET系统类库。在这里正是通过获取Microsoft.NET系统类库中的System.Console.WriteLine()来完成我们想要的控制台输出操作。现在使用记事本来编写这段代码,并将他的文档名保存为HelloWorld.cs,其中".cs"是C#源代码文档的扩展名。然后在配置好C#编译器的命令行环境里键入"csc HelloWorld.cs"编译文档。能够看到编译输出文档HelloWorld.exe。键入HelloWorld执行这个文档可得到下面的输出:

Hello World !

这就是第一个C#的程式,我们使用csc.exe来编译他,对于这个C#编译器,有如下说明:
1. 他是随.Net Framework SDK免费发布的,能够在DOS命令行被调用
2. 他的使用方法如下:
  csc SourceFile.cs /out:TargetFile.exe
  假如不使用输出参数指定目标文档名,则默认输出为源文档名
3. 一般情况下,他在系统文档夹(Windows或WinNT)下的Microsoft.NET\Framework\v1.0.3705文档夹内
4. 假如您安装了VS.Net,从Visual Studio.NET Tools项目组中能够激活Visual Studio.NET Command Prompt窗口,这是个配置好C#编译器的命令行环境
5. 使用csc.exe编译后的C#程式并不是机器代码(尽管拥有.exe的后缀名)。如前所述,C#程式只是被编译成了MSIL代码。

C#编译器(csc.exe)编译后的文档并不是个严格意义上的可执行文档(并不包含机器代码),而是个PE(portable executable)格式的文档,虽然他同样拥有.exe的后缀名。在这个PE文档中也不但仅只包含中间语言,在其中还包含有元数据(Metadata)和一个由编译器添加的目标平台的标准可执行文档头。

中间语言,确切地说,应该称为微软中间语言(Microsoft Intermediate Language,MSIL),是由微软定义的一种界于源代码和机器码之间的一种语言。在CLR中,他首先会由特定的语言编译器将其包装成exe格式的伪代码(P代码)。再由特定的编译器将其转换为本地代码执行。对于微软中间语言,一个形象的比喻是:假如CLR是操作系统的话,那么微软中间语言就是.Net平台上的ASM汇编语言。他比大多数 CPU 机器语言更为高级,比如他能够理解对象类型,并具备创建和初始化对象、调用关于对象的虚拟方法连同直接操作处理数组元素的指令。他甚至还具备发现和捕获异常情况用于错误处理的指令。

元数据(Metadata)和MSIL一起存在于编译好的程式文档之中,描述了此程式包含的类型的定义、各种类型的签名及其他一些数据,相当于以前的类型库(Type Library),同时也记载了此程式所引用到的其他外部类。元数据的主要作用是将和代码有关的更多的信息提供给CLR。基本上,元数据用于如下各项任务:用于表示CLR用途的信息,如定位和装载类、内存中这些类的实例、解决调用、翻译IL为源代码、加强安全并配置运行时上下文边界。

一个由C#语言写就的源码文档在CLR环境中执行的过程是这样的:首先由C#编译器编译成包含了中间语言和元数据的PE文档,当我们在系统中调用这个文档时,CLR会启动一个编译器再将这个PE文档包含的MSIL代码转换成为托管的本地代码。转换MSIL代码为本地码的这个编译器就叫做JIT编译器(Just In Time,JITer)。请注意他并不是前面我们用到的C#编译器。
现在让我们看看JIT编译器是如何工作的:当PE文档被调用时,JIE编译器将其分解为MSIL和元数据,这时候MSIL并不直接让.Net去调用本地的系统接口,而是指定.Net系统去编译连接那些需要的CLR DLL,编译出百分之百的本地代码。整个的过程如下:
当一个类型被装载时,装载器创建一个存根(stub),并使他和类型的每一个方法相连接。当一个方法第一次被调用时,存根把控制交给JITer。JITer把MSIL编译为本地代码,并且把存根指针指向缓冲本地代码。已被JITer编译的方法随后就直接调用已产生的本地代码,减少了JITer编译和执行代码的时间。能够看到,JITer并不会一次性的将任何的MSIL都编译为本地代码,而是在我们需要时才实时编译,也就是说,有些代码可能从来都没有被编译过。很明显这样做的好处是既确保了运行期的安全性,又不会损失太多的效率。

这就是个C#程式执行时的步骤。整个过程是这样的:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 使用c#研发一个简单的p2p应用_c#应用

下一篇: c#,深入浅出全接触(四)_c#教程