




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、什么是托管C+?在回答这个问题,首先要搞清楚什么是“托管”(Managed)。托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完全可以把“托管”视为“.NET”。那么什么是“通用语言运行时”?通用语言运行时是.NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。也就是说,使用托管C+意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的.NET框架应用程序。由托管概念所引发的C+应用程序包括托管代码、托管数据和托管类三个组成部分。(1)托管代码:.Net环境提供了许多核心的运行(RUNTIME)服务,比如异常处理和安全策略。为了能使用这些服务,必须要给运行环境提供一些信息代码(元数据),这种代码就是托管代码。所有的C#、VB.NET、JScript.NET默认时都是托管的,但Visual C+默认时不是托管的,必须在编译器中使用命令行选项(/CLR)才能产生托管代码。(2)托管数据:与托管代码密切相关的是托管数据。托管数据是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 JScript.NET 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual C+数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。(3)托管类:尽管Visual C+数据在默认情况下是非托管数据,但是在使用C+的托管扩展时,可以使用“_gc”关键字将类标记为托管类。就像该名称所显示的那样,它表示类实例的内存由垃圾回收器管理。另外,一个托管类也完全可以成为 .NET 框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互操作,如托管的C+类可以从Visual Basic类继承等。但同时也有一些限制,如托管类只能从一个基类继承等。需要说明的是,在托管C+应用程序中既可使用托管类也可以使用非托管类。这里的非托管类不是指标准C+类,而是使用托管C+语言中的_nogc关键字的类。2、用托管C+可以开发.NET框架的项目类型使用托管C+应该是C+程序员编写.NET框架应用程序最好的一种选择,通过集成在Visual Studio.NET开发环境的托管C+向导,我们可以创建以下几种开发.NET框架的项目类型:(1) 托管C+应用程序:用来创建一个支持托管扩展的单独C+应用程序,使用它还可创建任何类型的应用程序,包括.NET框架客户应用程序。(2) 托管C+类库:用来创建一个支持托管扩展的C+DLL,使用它可以生成一个能被.NET框架应用程序调用的托管类型的组件。(3) 托管C+空项目:用来创建一个空的托管项目,该项目只含有支持托管扩展的正确编译和链接的开关选项。使用它能将一个已有的C+源文件进入到一个托管环境中。(4) 托管C+ Web服务:用于创建两个项目,一个是C+托管扩展项目,另一个是部署项目。3、托管C+与标准C+的主要区别尽管托管C+是从标准C+建立而来的,但它与标准C+有着本质上的区别,这主要体现在以下几个方面:(1) 广泛采用“名称空间”(namespace)名称空间是类型的一种逻辑命名方案,.NET使用该命名方案用于将类型按相关功能的逻辑类别进行分组,利用名称空间可以使开发人员更容易在代码中浏览和引用类型。当然,我们也可将名称空间理解成是一个“类库名”。尽管很早Microsoft就在Visual C+中支持名称空间的编程方式,但是很少引起Visual C+程序员的普遍关注。现在在托管C+程序中,我们必须使用这一方式,即使用#using和using关键字。例如下面的简单程序代码是在控制台上输出“Hello World”:#usingusingnamespaceSystem;int main(void)Console:WriteLine(SHello World);return 0;代码中,#using是用来将一个元数据文件输入到托管C+程序中,这些文件可以是包含托管数据和结构的MSIL (Microsoft intermediate language,微软中间语言)文件,如DLL、EXE、OBJ文件等。mscorlib.dll是.NET框架的一个核心类库,包含主要的名称空间System。程序的第二行代码“usingnamespaceSystem;”用来使用System名称空间。System是.NET框架根名称空间,包含最基本的类型,如用于数据流的输入/输出的System:IO等。在对托管C+程序开发的不断深入,我们不久就会发现,许多类型的引用都要在程序的前面使用#using和using来进行。(2) 基本数据类型的变化我们知道,标准C+语言的数据类型是非常丰富的。而托管C+的数据类型更加丰富,不仅包含了标准C+中的数据类型,而且新增了 _int64(64位整型)、Decimal(96位十进制数)、String*(字符串类型)和Object*(对象类型)等类型,表1-1列出它们各自数据类型。类型描述标准C+类型名托管C+类型名长度(位)布尔型boolbool8字符型charsigned char8无符号字符型unsigned charchar8短整型short intshort16无符号短整型unsigned short intunsigned short16整型intint 或 long32无符号整型unsigned intunsigned int 或 long32长整型long intlong32无符号长整型unsigned long intunsigned long32单精度浮点型floatfloat32双精度浮点型doubledouble64长双精度浮点型long double-64Unicode字符-wchar_t1664位整型-_int6464无符号64位整型-unsigned _int646496位十进制值-Decimal96对象类型-Object*32字符串类型-String*-需要注意的是,String和Object在定义一个变量时,注意要有星号(“*”),但这个变量不是指针变量,这与标准C+的含义是不一样的。例如上面的代码可以改为:#usingusingnamespaceSystem;int main(void)String* hello = SHello World;Console:WriteLine(hello);return 0;(3) 新增三个托管C+类型:_gc class、_value class和_gc interface一个_gc类或结构意味着该类或结构的生命周期是由.NET开发平台自动管理及垃圾自动收集,用户不必自已去调用delete来删除。定义一个_gc类或结构和标准C+基本相似,所不同的是在class或struct前加上_gc,例如下面的代码:_gc class G public:int k;int sum(int);G:sum(int i) return i*(i + 1)/2;int main()G * g = new G;Console:WriteLine(g-sum(4); / 结果输出10return 0;但要注意:A. 一个_gc类不能从一个非托管类中继承,且不能包含从它派生的非托管类。但一个_gc类最多可以从一个托管类中继承。B. 一个_gc类不能定义成一个友元类或包含一个友元成员函数。所谓友元函数,是用来让外部函数访问类中的私有和保护类型成员。C. 一个_gc类不能声明或定义以及重载new或delete操作以及不能包含using等声明。_value类是用来使用具有短生命期的小型数据项,它不同于_gc类。_gc类数据分配在CLR堆中,而_value类对象是在运行栈或称为NDP(.NET Developer Platform,.NET开发者平台)堆中创建的,从而避免了垃圾回收器不断分配和释放空间而带来的开销。一个_value类可以声明成为一个局部变量、参数和返回值,也可嵌入到一个_gc类中或是作为一个静态变量或在C+堆中分配的变量。例如下面的代码:#usingusingnamespaceSystem;_value struct V int i; ;_gc struct G V v; ; / 嵌入到_gc类中V f(V v) / 定义一个全局函数,其值存储在运行栈中v.i += 1; / 不影响原来形参v的值return v; / 返回V结构类型的值int main(void)V v1 = 10; / 在运行栈中声明并初始化V v2 = f(v1); / 调用f函数,此时v1中的i为10,而v2中的i为11G *pG = new G; / 为G实例分配堆空间pG-v = v1; / pG的v中的i为10pG-v.i += v2.i; / pG的v中的i为10+11=21Console:WriteLine(v1.i); / 输出结果为10Console:WriteLine(v2.i); / 输出结果为11Console:WriteLine(pG-v.i); / 输出结果为21return 0;除此之外,所有的_gc对象都是从类System:Object 派生而来,因而能够很容易使用作用在_gc类中的集合和映射功能。然而_value类型并没有与这个基类所共享,因而不能直接将_value作为函数中的Object*实参。为了解决这个问题,.NET允许我们使用_box关键字将一个_value类型视为一个_gc对象。此时_value 类型被封装成一个_gc类桩子(Stub),并被复制到NDP堆中。由于在托管C+中,box不具备隐式转换的功能,因此在转换时必须指明转换的类型。托管C+中的_gc接口最能体现COM接口的思想,它的定义和声明是非常简单的,它除了关键字不同外,与一个_gc类的声明极为相似。例如下面的代码定义了一个接口IMyBase,其中包含了一个f的方法:_gc _interface Ibase void f();需要说明的是,接口中所有的方法默认时都是纯虚的且都是公有的,我们不需要在方法之前使用virtual关键字或在方法之后加上“= 0”。其次,在一个_gc接口中不能包含数据成员以及静态成员,也不能包含任何类的声明。下面举一个示例来说明_gc接口的使用:#usingusingnamespaceSystem;_gc _interface Ibase1 int f(int);_gc _interface Ibase2 int f(int);_gc struct C: Ibase1, Ibase2 int f(int i) / 接口方法的实现return 2*i-1;int main(void)C* c = new C;Console:WriteLine(c - f(1).ToString(); / 输出结果为1Console:WriteLine(_try_cast(c)-f(2).ToString();/ 输出结果为3Console:WriteLine(_try_cast(c)-f(3).ToString();/ 输出结果为5return 0;代码中,_try_cast用来将某个对象转换成一个指定类型,并当类型转换失败时自动处理由此产生的异常。ToString用来将对象描述成一个字符串。(4) 简化属性操作在_gc类中可以使用.NET的属性,这个属性简化了属性函数的调用操作,这与标准C+中的属性不一样。在标准C+中分别通过get_和put_成员函数来设置或获取相关属性的值。现在,托管C+中的属性操作就好比是对一个属性变量进行操作,例如下列代码:#usingusingnamespaceSystem;_gc class G public:_property int get_Size() Console:WriteLine(Sget_属性);return nSize;_property void set_Size(int i) Console:WriteLine(Sset_属性);nSize = i;private:int nSize;int main() G * pG = new G;pG-Size = 10; / 调用set_Sizeint i = pG-Size; / 调用get_SizeConsole:WriteLine(i);程序结果为:set_属性get_属性10需要说明的是,托管C+使用_property关键字来定义一个属性的成员函数。从代码中可以看出设置和获取属性的成员函数名称中分别使用了 set_和get_,这样编译器会自动生成一个伪成员变量Size,这个变量名是set_和get_成员函数后面的名称。注意不要再在get_成员函数代码中使用这个伪成员变量Size,它会引起该函数的递归调用。(5) 托管C+的委派在C/C+中,一个函数的地址就是内存地址。这个地址不会带有任何其它附加信息,如函数的参数个数、参数类型、函数的返回值类型以及这个函数的调用规范等。总之,C/C+的回调函数不具备类型安全性。而.NET框架在回调函数的基础增加了提供类型安全的机制,称为委派。托管C+的委派方法不像C#那么复杂,它简化了委派绝大部分的内部机制,因而使得它的使用变成非常简单容易。例如下面的代码:#usingusingnamespaceSystem;_delegate int GetDayOfWeek(); / 委派方法的声明_gc class MyCalendarpublic:MyCalendar() : m_nDayOfWeek(4) int MyGetDayOfWeek() Console:WriteLine(非静态方法);return m_nDayOfWeek;static int MyStaticGetDayOfWeek() Console:WriteLine(静态方法);return 6;private:int m_nDayOfWeek;int main(void)GetDayOfWeek * pGetDayOfWeek
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025部编人教版小学三年级语文上册全册教案
- 重庆计算机类知识培训课件
- 重庆知识产权优势企业培训课件
- 新解读《GB-T 30638-2014杯装果冻包装机》
- 重庆春招直通车配套课件
- 重庆市驾校培训理论知识课件
- 图形的轴对称等腰三角形(2大考点5种解题方法)原卷版
- 图形的运动(12个考点)-2023学年七年级数学上学期期末考点复习(沪教版)
- 新解读《GB 30756-2014镍冶炼安全生产规范》
- 统计与概率:条件概率、全概率公式与贝叶斯公式、全概率公式与数列递推问题(原卷版)-2026届高三数学一轮复习
- 专职安全生产管理人员综合类C证习题(含答案)
- 2025年市场监管总局机关公开遴选公务员面试模拟题及答案
- 注册安全工程师考试道路运输和其他安全安全生产实务(初级)试卷与参考答案
- 构建餐饮油烟共治格局的策略及实施路径
- 《MySQL数据库教程》课件第一章数据库概述
- 2025年“中央八项规定”精神学习知识竞赛测试题库及答案
- 铝单板幕墙专项方案
- GB/T 42062-2022医疗器械风险管理对医疗器械的应用
- 第六节-食品新资源的开发-课件
- 复变函数-西安交大版课件
- 南方医大护理学导论教案
评论
0/150
提交评论