科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道超越C 下一代C ―C /CLI简介

超越C 下一代C ―C /CLI简介

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

    一、绪论 当微软推出VS.NET7实现了可扩展的托管C 后,C 程序员们反映不一。尽管大部分的程序员对于能够继续使用C 感到很欣慰,但几乎所有的人对于托管C 提供的晦涩语法感到很痛苦。微软明显从反馈中感觉到托管C 不是那么成功。

作者:中国IT实验室 来源:中国IT实验室 2007年10月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  

 

七、CLR对象示例

void _tmain()

{

String^ str = gcnew String("Hello World");

Object^ o1 = gcnew Object();

Console::WriteLine(str);

}

关键字gcnew用来实例化一个CLI对象,而且它返回一个指向在CLR堆上的对象的句柄,gcnew的优点在于它可以方便的让我们区分拖管和非拖管的实例对象。

大部分情况下,gcnew关键字和^操作符提供了你用来进行BCL的一切手段,但是很明显你需要创建和声明属于自己的拖管类和接口。

八、声明类型

CLR类型有一个形容词前缀用来说明类型的种类,下面是C++/CLI中的类型声明示例:

1、 CLR types 

o Reference types 

§ ref class RefClass{...}; 

§ ref struct RefClass{...}; 

2、 Value types 

§ value class ValClass{...}; 

§ value struct ValClass{...}; 

o Interfaces 

§ interface class IType{...}; 

§ interface struct IType{...}; 

o Enumerations 

§ enum class Color{...}; 

§ enum struct Color{...}; 

3、 Native types 

o class Native{...}; 

o struct Native{...}; 

示例:

using namespace System;

interface class IDog

{

void Bark();

};

ref class Dog : IDog

{

public:

void Bark()

{

Console::WriteLine("Bow wow wow");

}

};

void _tmain()

{

Dog^ d = gcnew Dog();

d->Bark();

}

上述程序中的代码与老的C++语言相比看上去非常简洁,在以往的C++代码中,至少要用到-gc和-interface这两个关键词。

九、装箱/拆箱操作

在C++/CLI中,加箱是隐含的,而且类型是安全的,一个二进制的拷贝被执行并在CLR堆上形成一个对象,去箱是显式的,仅仅需要使用reinterpret_cast操作符来解除引用。

void _tmain()

{

int z = 44;

Object^ o = z; //implicit boxing

int y = *reinterpret_cast<int^>(o); //unboxing

Console::WriteLine("{0} {1} {2}",o,z,y);

z = 66; 

Console::WriteLine("{0} {1} {2}",o,z,y);

}

// 输出结果如下:

// 44 44 44

// 44 66 44

在上述代码中,"o"对象是一个加箱的拷贝,从第二个语句Console::WriteLine.的输出可以很明显地看到,它并没有涉及到int类型的整数值。

当你对一种数值类型进行加箱操作时,返回的对象记住了最初的数值类型。

void _tmain()

{

int z = 44;

float f = 33.567;

Object^ o1 = z; 

Object^ o2 = f; 

Console::WriteLine(o1->GetType());

Console::WriteLine(o2->GetType()); 

}

// Output

// System.Int32

// System.Single

因此不能对不同类型的对象进行去箱操作。

void _tmain()

{

int z = 44;

float f = 33.567;

Object^ o1 = z; 

Object^ o2 = f;

int y = *reinterpret_cast<int^>(o2);//System.InvalidCastException

float g = *reinterpret_cast<float^>(o1);//System.InvalidCastException

}

如果你非尝试这么做,那么你将得到一个System.InvalidCastException。让我们来探讨一下完美的类型安全性,如果你要看内部代码,你将看到微软的内部箱在实际中的运用。例如:

void Box2()

{

float y=45;

Object^ o1 = y;

}

编译后的代码是:

.maxstack 1

.locals (float32 V_0, object V_1)

ldnull

stloc.1

ldc.r4 45.

stloc.0

ldloc.0

box [mscorlib]System.Single

stloc.1

ret

根据微软的内部文档,箱操作将未加工的类型转换为一个具体类型的实例,这项工作的完成通过创建一个新的对象并将数据拷贝到这个新分配的对象。

十、写在后面的话

为什么很多人已经可以使用C、C++、.NET来开发程序但还在积极学习C++/CLI呢,我想有四个方面的原因:

1、从编译器直到内层都还在支持C++代码;

2、C++/CLI对于其他标准来说无意是具有毁灭性地;

3、与生俱来的内部支持胜过所有其他CLI语言

4、所有在MFC中出现的下划线都已不再存在。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件