C#代码执行过程;值类型和引用类型;深拷贝和浅拷贝

时间:2020-12-11 19:50:36

(一)

1.概述

Main()函数我们有以下几条准则:

1.Main()函数必须封装在类或结构里来提供可执行程序的入口点。C#采用了完全的面向对象的编程方式,C#中不可以有像C++那样的全局函数。

2.Main()函数必须为静态函数(static)。这允许C#不必创建实例对象即可运行程序。

3.Main()函数保护级别没有特殊要求, public,protected,private等都可,但一般我们都指定其为public。

4.Main()函数名的第一个字母要大写,否则将不具有入口点的语义。C#是大小写敏感的语言。

5.Main()函数的参数只有两种参数形式:无参数和string 数组表示的命令行参数,即static void Main()或static void Main(string[]args) ,后者接受命令行参数。一个C#程序中只能有一个Main()函数入口点。其他形式的参数不具有入口点语义,C#不推荐通过其他参数形式重载Main()函数,这会引起编译警告。

6.Main()函数返回值只能为void(无类型)或int(整数类型)。其他形式的返回值不具有入口点语义。(摘自MSDN)

 

2.编译过程

事实上,C#编译成的EXE文件并不是一个可执行文件。因为以下原因才使得EXE文件得以执行。

(1)这个EXE文件是由IL、Metadata、基于目标平台的标准的可执行文件头,这个文件头是编译器加上的,这个3个东西构成了PE(Portable Executable),一个可执行体,也就是这个EXE文件。但它不是二进制文件。

(2)IL包含了一组独立于CPU的指令集,可被JIT翻译成二进制代码。任何托管代码都会被编译成IL,于是各语言之间就可以互操作了,并且独立于运行平台。注意,在编译过程中,CTS(公共类型系统)会根据元数据表去检查类型安全。

Metatable是嵌在PE文件中的表集合。描述了代码中的数据类型和一些在代码执行时CLR需要知道的信息。元数据使代码具有自描述特性,提供了类型安全(是指代码访问被授权访问的内存地址)保障。

 

3.执行过程

操作系统将PE和其他DLL文件载入系统

操作系统根据PE文件中的可执行文件头转到程序的入口点,这个入口点是Mscoree.dll中的_CorExeMain()函数。这个函数开始执行中间代码。执行的意思是:CLR按照调用的对象方法为单位,即是以一个对象里面的成员方法为单位,用JIT将IL编译成二进制代码,并根据需要存于内存缓存。

程序执行完毕,操作系统卸载程序。

 

(二)值类型和引用类型

值类型:本身携带数据

引用类型:指向包含数据的内存块

 

(三)深拷贝和浅拷贝

浅拷贝:给对象拷贝一份给新对象。只对值类型(string类型)分配新的内存地址。继承memberwiseclone类。

深拷贝:把原来的对象拷贝一份,完全重新分配地址。实现ICloneable接口。