- c#与.Net的关系
c#是一门语言,.Net是一个平台。c#有了.Net这个平台才能更好更全的发挥出所有的功能。
.Net平台其实就是.NetFrameWork,它主要包含三个部分:1、编译器2、基础类库BCL( bass class Library)3、公共运行库CLR( common language runtime)。
.NetFrameWork版本主要是2.0,3.0,3.5,4.0,其中3.0,3.5版本用的都是2.0的运行库。相当于2.0,3.0,3.5是一个版本的整体。我们可以到windows/Microsoft.Net/FrameWork/下常看各个版本的文件。发现3.0里面的文件很少,主要是给2.0提供了工作流,WPF,WinsowsCommunicationFundation的技术。3.5里面提供了泛型等类库。4.0则是脱离2.0,3.0,3.5的一个单独的完整的版本。.NetFrameWork4.0向下兼容的条件的前提是:必须同时装上2.0,3.0,3.5。
- c#的执行过程
1、编译器接收源代码file.cs生成一个名为程序集的文件(.dl类库文件或者.exe文件)。程序集文件包括:可执行程序的描述,元数据,IL,资源。
->元数据就是一个关系表,存储表述类于其他类型信息的数据域关系。
->IL (Inermediate Language)也称为 CIL MSIL,.Net平台的汇编代码
2 CLR中的JIT(Just in Time)会对IL进行及时编译,将其编译成机器码到操作系统上OS(也就是说代码需要执行的时候才编译),编译后进行缓存,若是下一次执行同以代码,就直接从缓存里读取数据。
所以说,CLR中有两个重要的部分,一个是JIT,需要将中间语言编译成机器码,并对代码进行缓存,以供复用,同时还会做优化代码的工作。另一个是GC,帮助管理内存。
按照以上:执行时才编译-编译时就缓存的过程执行的语言成为编译型语言,它的优点是:利用缓存,以空间换时间,提高性能,加快运行速度。其中又有GC帮助我们自动管理内存,所以我们不用很担心这样会给程序员带来缓存上的问题。
其中,垃圾回收器GC(gabbage collector)的执行过程为:当一个对象没有引用指向的时候,系统就会通过调用GC.Collect()回收内存。具体如何回收的呢?
比喻:内存好比餐厅刚用餐的饭桌,服务员好比是GC.collect(),需要移除不用的盘子,调整还有菜的盘子,然后上新菜。实际上,系统底层维护了一个数据类型(三个固定长度的数组),他们分别为0代,1代,2代,系统会将新创建的对象放在0代上,将0代保留下来的对象放在1代上,当1代满了后,则往2代放,2代满了则系统就崩溃了。
- c#的反编译
ildasm对程序集进行反汇编
ilasm对il代码编译成程序集
- 方法重载的复习(略,见前几篇博客,)
我们可以声明带有默认参数的方法来代替方法重载,推荐尽量用默认参数的方法来实现方法重载的功能。
比如代码
class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数字"); Console.WriteLine(ReadInt.Read()); Console.WriteLine("请输入小于89的数字"); Console.WriteLine(ReadInt.Read(89)); Console.WriteLine("请输入一个介于1-100之间的数字"); Console.WriteLine(ReadInt.Read(1, 101)); Console.ReadKey(); } } class ReadInt { public static int Read() { return Read(int.MinValue, int.MaxValue); } public static int Read(int max) { return Read(0, max); } public static int Read(int min, int max) { int num = 0; while (true) { string str = Console.ReadLine(); if (int.TryParse(str,out num)) { if (num>=min && num<max) { return num; } else { Console.WriteLine("您输入的数字不在范围之内,请重新输入"); continue; } } Console.WriteLine("输入格式错误,请重新输入"); } } }
该方法重载可以用默认参数的形式来实现其功能
static void Main(string[] args) { Console.WriteLine("请输入一个数字"); Console.WriteLine(ReadInt(int.MinValue, int.MaxValue)); Console.WriteLine(ReadInt(max:89)); Console.ReadKey(); } static int ReadInt(int min=0,int max=100) { int num = 0; while (true) { string str = Console.ReadLine(); if (int.TryParse(str, out num)) { if (num >= min && num < max) { return num; } else { Console.WriteLine("输入不在范围内请重新输入"); continue; } } Console.WriteLine("输入格式有问题"); } } }
- 枚举复习
语法:访问修饰符 enum 枚举名{ 成员1,成员2,成员2}
默认情况下,成员1转换为int类型为0,成员2对应的int类型为1,成员3对应的int类型为2。
我们可以手动更改成员对应的数字(可参考c#图解)
作用:将数字与成员绑定在一起。方便程序员操作。