技术资料 - .Net技术总结、学习心得体会

  • C#(CSharp)编写的所有代码总是在.Net Framework中运行。对于C#(CSharp)语言来说,可以得出两个重要的结论:
  • - C#(CSharp)的结构和方法反映了.Net基础方法论。
  • - 在许多情况下,C#(CSharp)的特定语言功能取决于.Net的功能,或依赖于.Net基类。
  • 一、 C#(CSharp)与.Net的关系
    C#(CSharp)的重要性体现在以下两个方面:
  • 它是专门为与Microsoft的.Net Framework一起使用而设计的。
  • 它是一种基于现代面向对象设计方法的语言,在设计它时,Microsoft还吸取了其他类似语言的经验,这些语言是近20年来面向对象规则得到广泛应用后才开发出来的。
  • 二、 公共语言运行库(CLR)
    .Net Framework的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.Net运行库。在CLR的控制下运行的代码常常称为托管代码(managed code)。但是,在CLR执行开发的源代码之前,需要编译它们。
  • 在.Net中,编译分为两个阶段:
  • - 把源代码编译为Microsoft中间语言(IL Intermediate Language)。
  • - CLR把IL编译为平台专用的代码。
  • 1、 CLR的作用:
  • - 内存管理
  • - 跨语言支持
  • - 和windows资源集成
  • - 编译IL成机器码
  • 2、 托管代码的优点:
  • Microsoft中间语言与Java字节代码共享一种理念:它们都是一种低级语言,语法很简单(使用数字代码,而不是文本代码),可以快速地转换为内部机器码。
  • (1) 平台无关性
  • 编译成中间语言(IL)就可以获得.Net平台无关性,这与编译为Java字节代码的不会得到Java平台无关性是一样的,.Net目前只能用于Windows平台。
  • (2) 提高性能
  • 实际上,IL比Java字节代码的作用还要大。IL总是即时编译的(称为JIT编译),而Java字节码常常是解释性的,Java的一个缺点是,在运行应用程序时,把Java字节代码转换为内部可执行代码的过程会导致性能损失(但最近Java在某些平台上能进行JIT编译)。
  • JIT编译器并不是把整个应用程序一次编译完,这样会有很长的启动时间,而只是编译这调用的那部分代码。代码编译一次后,得到的内部可执行代码就存储起来,直到退出程序为止。
  • (3) 语言互操作性
  • 将任何一种编译为中间代码,编译好的代码可以与从其他语言通过编译过来的代码进行交互操作。除C#(CSharp)以外,包括语言例如,VB.Net、Visual C++.Net、Visual J#、脚本语言、COM和COM+。
  • 三、 中间语言(Intermediate Language)
    中间语言的主要特征:
  • - 面向对象和使用接口
  • - 值类型和引用类型之间的巨大差别
  • - 强数据类型
  • - 使用异常来处理错误
  • - 使用特性(attribute)
  • 1、 面向对象和使用接口
  • Microsoft IL也是传统的面向对象编程,带有类的单一继承性。同时中间语言还引入了接口的概念。
  • 2、 值类型和引用类型之间的巨大差别
  • 与其他编程语言一样,中间语言提供了许多预定义的基本数据类型。对于值类型,变量直接保存其数据,而对于引用类型,变量仅保存地址,对应的数据可以在该地址中找到。
  • 3、 强数据类型
  • 中间语言的一个重要方面是它是基于强数据类型。所有的变量都清晰地标记为属于某个特定的数据类型。一般不允许对模糊的数据类型执行任何操作。
  • A. 语言互操作性中强数据类型的重要性
  • 如果类派生其他类,或包含其他类的实例,它就需要知道其他类使用的所有数据类型,这就是强数据类型重要性的原因。
  • 例如VB.Net类中一个方法返回一个值,而C#(CSharp)中没有与其匹配的数据类型,在.Net中如何解决?
  • A) 通用类型系统(CTS,Type System)
  • 以上数据类型问题在.Net中使用CTS解决,CTS定义了可以在中间语言中使用的预定义数据类型,所有用于.Net Framework的语言都可以生成最终基于这些类型的编译代码。例如在VB.Net中的整型和C#(CSharp)中的int型,在中间语言中用类型Int32来表示。
  • B) 公共语言规范(CLS, Commo- Language Specification)
  • CLS和CTS一起确保语言的互操作性。CLS是一个最低标准集,所有面向.Net的编译器都必须支持它。
  • B. 垃圾收集
    到目前为止,Windows平台已经使用了两种技术来释放进程向系统动态请求的内存:
  • - 完全以手工方式使应用程序代码完成这些工作。
  • 例如C++就是采用此技术,但是最大的缺点就是频繁出现错误。请求内存的代码必须明确通知系统它什么时候不再需要该内存,很容易被遗漏,从而导致内存泄漏。
  • - 让对象维护引用计数。
  • 维护引用计数是COM对象采用的一种技术,其方法是每个COM组件都保留一个计数,记录客户机目前对它的引用数。当这个数下降到0时,组件会删除自己,并用释放内存和资源。但是只要有一个客户机在引用,对象仍驻留在内存中。
  • .Net运行库采用的方法是垃圾收集器,这是一个程序,其目的是清理内存,方法是所有动态请求的内存都分配到堆上(CLR维护它自己的托管堆),当.Net检测到给定进程的托管堆已满,就调用垃圾收集器进行清理。
  • C. 安生性
  • .Net很好地补足了Windows提供了安全机制,因为它提供的安全机制是基于代码的安全性,而Windows仅提供了基于角色的安全性。基于角色的安全性建立在运行进程的账户的身分基础上,换言之,就是谁拥有和运行进程。另一方面,基于代码的安全性建立在代码实际执行的任务和代码的可信程度上。
  • D. 应用程序域
  • 4、 使用异常来处理错误
  • 5、 使用特性(attribute)
  • 四、 程序集(assembly)
    程序集是包含编译好的、面向.Net Framework的代码的逻辑单元。类似于DLL。程序集完全是自我描述性的,是一个逻辑单元而不是物理单元,它可以存储在多个文件中(动态程序集的确存在内存中,而不是文件中)。程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个称为程序集清单的区域中,可以检查程序集的版本及其完整性。
  • 程序集包含程序元数据,表示调用给定程序集中的代码的应用程序或其他程序集不需要指定注册表或其他数据源,以便确定如何使用该程序集。这与以前的COM有很大的不同,以前,组件的GUID和接口必须从注册表中获取,在某些情况下,方法和属性的说细信息也需要从类型库中读取。
  • 1、 私有程序集
  • 私有程序集是最简单的一种程序集类型。私有程序集一般附带在某些软件上,而只能用于该软件中。附带私有程序集的常见情况是,以可执行文件或许多库的方法给应用程序提供私有程序集,这些库包含的代码只能用于该应用程序。
  • 因为私有程序集完全是自含式的,所以安装它的过程就很简单。只需把相应的文件放在文件系统的对应文件夹中即可(不需要注册表项),这个过程称为“0影响(xcopy)安装”。
  • 2、 共享程序集
  • 共享程序集是其他应用程序可以使用的公共库。
  • 共享程序集存在风险:
  • - 名称冲突
  • - 程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。
  • 这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树上,称为全局程序缓冲区(GAC)。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到缓冲区中。
  • 3、 反射
  • 因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这个技术称为反射。
  • 五、 .Net Framework类
    编写托管代码的最大好处是可以使用.Net基类库。
  • .Net基类包括:
  • u IL提供的核心功能,例如,通用类型系统中的基本数据类型。
  • u Windows GUI支持和控件。
  • u Web窗体(ASP.Net)。
  • u 数据访问(ADO.Net)。
  • u 目录访问
  • u 文件系统和注册表访问
  • u 网络和Web浏览
  • u .Net特性和反射
  • u 访问Windows操作系统的各个方面(例如环境变量)
  • u COM互操作性
  • 1、 命名空间
  • Microsoft建议在大多数情况下,都至少要提供两上嵌套的命名空间名,第一个是公司名,第二个是技术名或软件包的名称,而类是其中一个成员。例如:Accp.Web.UserManager。
  • 如果没有显示提供命名空间,类型就添加到一个没有名称的全局命名空间中。
  • 六、 用C#(CSharp)创建.Net应用程序
    1、 创建ASP.Net应用程序
  • - ASP.Net的特性
  • ASP.Net的页面是结构化的。这就是说,每个页面都是一个继承了.Net类System.Web.UI.Page的类。
  • 可使用MS VS.Net来创建页面、页面使用的业务逻辑和数据访问组件。
  • - Web窗体
  • - XML Web服务
  • 2、 创建Windows窗体
  • 3、 Windows服务
  • 七、 C#(CSharp)在.Net企业体系结构中的作用
    C#(CSharp)和.Net至少提供了四个优点:
  • - 组件冲突很少见,部署工作将更容易,因为同一组件的不同版本可以在同一机器上并行运行,而不会发生冲突。
  • - ASP代码不再很难读懂。
  • - 可以在.Net基类中使用许多功能。
  • - 对于需要Windows窗体用户界面的应用程序来说,利用C#(CSharp)可以容易编写这类应用程序。
  • 八、 总结
    .Net的下述特性在编译和执行过程中的作用:
  • - 程序集和.Net基类
  • - COM组件
  • - JIT编译
  • - 应用程序域
  • - 垃圾收集
  • 下图简要说明这些特性在编译和执行过程中是如何发挥作用的。