当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++:最强大的.NET语言之工具结构

C++:最强大的.NET语言之工具结构

2017-11-07 08:00 星期二 所属: C语言/C++ 教程 浏览:431

简介

  Visual C++开拓小组花了大量的时间用于听取用户的意见,在对 .NET和C++颠末仔细考量之后,抉择在Visual C++ 2005中从头设计对通用语言运行时库(CLR)的支持,此项从头的设计被称为"C++/CLI",它将为利用及编写CLR范例提供更自然的语法。在本文中,主要探讨了新的语法,并将之与C#和托管C++这两个CLR平台上极其临近的语言举办较量,在文中也会适内地以图表给出其与当地C++的相似之处。

  通用语言运行时库(CLR)包罗了一组类型,其是Microsoft .NET的基本,也是CLI的Microsoft版本实现。C++/CLI语言设计的方针是为了对CLI提供更自然的C++支持,而Visual C++ 2005的编译器则在CLR上实现了C++/CLI。

  当在仔细研究了Visual C++ 2005编译器和C++/CLI语言设计之后,就会发明它们转达了两条重要的讯息;首先,Visual C++把本身定位于在CLR平台上的最初级编程语言,(看起来好像没有须要利用其他语言了–包罗MSIL);其次,.NET编程应与当地C++编程一样自然。

  本文针对C++措施员,但并不想说服你放弃C#可能Visual Basic .NET。假如你很是喜欢C++,并想继承利用传统C++提供的全部成果,而又想要C#般的编程效率,那本文正适合你。别的,本文并不是CLR或 .NET Framework的简介,而把重点放在Visual C++ 2005是奈何使你可以编写 .NET Framework上更优雅和高效的代码。

  工具结构

  CLR界说了两种范例:值范例和引用范例。值范例被设计用于可举办高效地分派和会见,它们与C++的内置范例概略相似,你也能建设属于你本身的范例,这就是Bjarne Stroustrup所称的详细范例;另一方面,引用范例被设计用于提供面向工具编程所需的特性,可用于建设有着条理布局的类:譬喻派生类和虚拟函数。别的在CLR中,引用范例自始至终都提供了特另外运行时特性,如自动内存打点–凡是称为垃圾接纳。同时,对引用范例和值范例,CLR也提供了准确的运行时类信息,这种特性凡是被称为反射。

  值范例分派在仓库上;而引用范例凡是分派在托管堆中–这是由CLR垃圾接纳机制所打点的堆。假如你在C++中编写汇编代码,如平时那样,可在CRT堆中分派当地C++范例,在未来,Visual C++开拓小组甚至答允你在托管堆中分派当地C++范例,究竟,垃圾接纳对当地范例来说,也是一个极具吸引力的主题。

  当地C++答允选择在那里建设一个特定的工具,任何范例都可分派在仓库或CRT堆中。

// 分派在仓库上
std::wstring stackObject;

// 分派在CRT堆中
std::wstring* heapObject = new std::wstring;
   如上所示,在那里分派工具是独立于范例的,主动权完全把握在措施员的手中。别的,仓库与堆的分派语法也是易于区此外。

  另一方面,C#凡是是在仓库上建设值范例,而在托管堆中建设引用范例。下例中利用的System.DateTime范例,被声明为值范例。

// 分派在仓库上
System.DateTime stackObject = new System.DateTime(2003, 1, 18);

// 分派在托管堆中
System.IO.MemoryStream heapObject = new System.IO.MemoryStream();
  如上例所示,声明工具的方法并没有指出工具分派在仓库上或托管堆中,其完全取决于措施编写者和运行时库。

  C++的托管扩展–简称为托管C++,可在当地C++代码中殽杂托管代码。为了遵循C++尺度,C++被插手了扩展,以提供对CLR的全面支持。不幸的是,正是因为有太多的扩展,所以假如要用C++来编写大量的托管代码,就成了一件异常疾苦的事。

//分派在仓库上
DateTime stackObject(2003, 1, 18);

//分派在托管堆中
IO::MemoryStream __gc* heapObject = __gc new IO::MemoryStream;
  在C++措施员看来,在仓库上分派一个值范例看起来很是正常,而在托管堆中的分派方法,看起来就有点怪:__gc是托管C++扩展中的一个要害字,有意思的是,在某些环境下,托管C++能揣度你的意思,所以上述例子可重写为不带__gc要害字。

//分派在托管堆中
IO::MemoryStream* heapObject = new IO::MemoryStream;
  这样看起来更像当地C++代码了–但heapObject并不是一个真正的C++指针。C++措施员凡是倾向于在指针中生存一个稳定的数值,但垃圾接纳器会在任何时候,在内存中移动工具。另一个不敷之处是,不能仅仅依靠查察代码,就能确定工具是分派在当地照旧托管堆中,必需知道措施编写者是奈何界说一个范例的。

  C++/CLI为此引入了句柄的观念,以便把CLR工具引用与C++指针区别开来。少了C++指针寄义的重载,语言中也少了许多歧义,别的,通过句柄,对CLR也能提供越发自然的支持,譬喻,你能在C++中,直接对引用范例利用操纵符重载,因为此时句柄已经能支持操纵符重载了。由于C++克制指针操纵符重载,假如没有"托管"指针,这险些不行能实现。

//分派在仓库上
DateTime stackObject(2003, 1, 18);

//分派在托管堆中
IO::MemoryStream^ heapObject = gcnew IO::MemoryStream;
  相对付值范例声明来说,和以前没什么差异,但对引用范例声明来说,变革却很明明,操纵符 ^ 把变量声明为对一个CLR引用范例的句柄。当垃圾接纳器在内存中移动被引用的工具时,同时也会自动更新句柄的值。别的,它们是可重绑定的,这答允它们可像C++指针那样指向差异的工具。别的需留意的一件事是,操纵符gcnew已经取代了操纵符new,清楚地指明白工具被分派在托管堆中。对托管范例,操纵符new已经不能被重载(此处并非语带双关),只能把工具分派在CRT堆中,除非你提供本身重写的new操纵符。

  简而言之:当地C++指针已经与CLR工具引用大不沟通了。

 

    关键字:

天才代写-代写联系方式