C#的两次编译,一次运行

C#基础(Day01)_命名空间

C#的程序要经过两次编译,一次运行,经过两次编译的好处是:不同语言可以共同开发,而且CLR会根据你电脑的CPU去生成适合本机CPU的二进制语言。

第一次编译:第一次的编译的编译器是与程序语言有关的,它不属于CLR。通过语言编译器将C#语言编译成中间语言IL。
而当别的程序调用的时候或点击该程序的.exe文件时进行第二次编译。第二次编译是通过JIT编译器将中间语言编译成机器认识的二进制语言。
 
此外,如果我们在C#源程序中调用微软定义好一些类库时,我们是否也要将我们引用的这些类库编译成中间语言打包在.exe或.dll文件中呢?答案是不需要的,这些类库都被打包在.net framework(运行库+类库)中,所以我们只需要在源程序中建立一个引用就可以了,当我们调用.exe文件时,CLR会根据建立的引用去调用那些类库,但前提是我们的电脑上必须安装了.net framework。但当我们在C#源程序中调用的是第三方定义的类时,我们就需要把这些类编译成中间语言打包到.exe或.dll文件中。
 
在.net中有两种编译方法:JIT编译器,调用什么方法编译什么方法,把编译过的方法放到内存中。适合.exe经常性开关的。
                             Ngen.exe编译器,一次编译一个程序集,而且与JIT编译器不同的是,它编译好的文件并不存放在内存中,而是以文件形式保存。这个适合.exe文件长时间不关的。
 
看完了C#的二次编译一次运行后,我们再来看看命名空间。
 
命名空间是把功能相同的一些类包裹在一起。通常用using引入命名空间,using在.NET中并不仅仅用于引入命名空间,它还有另一种用法,using(SqlConnection con=new SqlConnection()){} 在这里,我们声明了一个对象(实现IDisposable),当程序出了using后的大括号结束的时候,会自动隐式的调用当前对象的Dispose()释放当前对象,如果该对象没有Dispose方法而使用using会报错。
另外,命名空间只能在命名空间里嵌套,不能在类中嵌套,同一命名空间可以嵌套多个命名空间。
 
命名空间看完了,我们再来看看方法。
方法是执行一个功能的。我们进入一个程序的时候,首先碰到的就是Main方法。Main方法的返回值可以有两种(int或void),参数也可以有两种(没有参数或只有string类型的数组参数),当Main方法有返回值时,我们可以用批处理命令获取返回值“@echo %ERRORLEVEL%”把这个命令用txt文档保存,并把扩展名改成bat,然后在VS命令行中获得结果。
 
最后,我们再来看看C#中的注释:
//   单行注释
/* */   多行注释
///   xml注释  只对命名空间内部的,方法外部的起作用