C#知识点

程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。


应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。


C#应用程序域:

       在以前传统的开发中我们都知道,一个应用程序对应一个进程,并为该进程指定虚拟内存,由操作系统来映射实际的物理内存,有效的维护了进程之间的安全性。但另一方面,每一个进程都会消耗一定的系统资源,降低了性能,并且进程间的通信也比较麻烦。

       在.NET中推出了一个新的概念:C#应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。


C#反射机制:

反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码

 

一、反射的作用:

动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型

应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射

反射主要应用于类库,这些类库需要知道一个类型的定义,以便提供更多的功能

 

二、应用要点:

现实应用程序中很少使用到反射

使用反射动态绑定需要牺牲性能

有些元数据信息是不能通过反射获取的

某些反射类型是专门为那些CLR开发编辑器开发使用的,所以你要意识到不是所有反射类型都是可以使用的

 

三、取得Assembly的方法:

Assembly.Load

Assembly.LoadFile

Assembly.LoadFrom

Type对象的Assembly方法

 

四、反射的成员:

MemberInfo-成员

ConstructorInfo-结构

FieldInfo-字段

MethodInfo-方法

PropertyInfo-属性

EventInfo-事件

 

反射的性能:

使用反射来调用类型或者触发方法,或者访问一个字段或者属性时CLR需要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的。所以尽量不要使用反射进行编程,对于打算编写一个动态构造类型(晚绑定)的应用程序,可以采取以下的几种方式进行代替:

1、通过类的继承关系。让该类型从一个编译时可知的基础类型派生出来,在运行时生成该类型的一个实例,将对其的引用放到其基础类型的一个变量中,然后调用该基础类型的虚方法。

2、通过接口实现。在运行时,构建该类型的一个实例,将对其的引用放到其接口类型的一个变量中,然后调用该接口定义的虚方法。

3、通过委托实现。让该类型实现一个方法,其名称和原型都与一个在编译时就已知的委托相符。在运行时先构造该类型的实例,然后在用该方法的对象及名称构造出该委托的实例,接着通过委托调用你想要的方法。这个方法相对与前面两个方法所作的工作要多一些,效率更低一些。


命名空间与装配件的关系:

        很多人对这个概念可能还是很不清晰,对于合格的.Net程序员,有必要对这点进行澄清。

        命名空间类似与Java的包,但又不完全等同,因为Java的包必须按照目录结构来放置,命名空间则不需要。

        装配件是.Net应用程序执行的最小单位,编译出来的.dll、.exe都是装配件。

       装配件和命名空间的关系不是一一对应,也不互相包含,一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在。

 

C#中的装箱和取消装箱:

 

把值类型的实例转换为引用类的实例,就称为装箱,其逆过程称为取消装箱。

(装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型 )


      .NET中,数据类型划分为值类型和引用(不等同于C++的指针)类型,与此对应,内存分配被分成了两种方式,一为栈,二为堆,注意:是托管堆。

      值类型只会在栈中分配。

      引用类型分配内存与托管堆。

      托管堆对应于垃圾回收。

装箱:用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。

拆箱:从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。




posted @ 2013-07-25 19:28  旧事乡里人  阅读(143)  评论(0编辑  收藏  举报