体验Visual Studio 2005中C 语言

2008-02-23 05:34:38来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

Viusal Studio2005极大地丰富了他的库,能够说是科研背后的清障机和加速器,对于这一点,我想大部分人都是这么认为的。他带来的大量工具及新增的功能性函数使研发人员的生活越来越快乐、简单。但对于我来说,任何这些和Visual Studio2005在C 上做的改变相比却都显得是那么苍白无力。这篇文章中,我着重叙述即将向用户发行的Viusal Studio2005版本给C 带来的变化。

一、对下划线说再见

Visual Studio.NET 2002在C 中引入了可扩展的托管,这种扩展带来的关键词以双下划线开始,例如__gc 和 __property。这个版本发行后的这些年来,我写了大量带有双下划线的代码,我不得不承认我从来都不喜欢这一点,我完全明白真正的原因是什么:双下划线将关键词标志为特别地扩展,以区分编译器的标准编译规则,在理论上,能够充分使用可扩展的托管,使用其他的编译器编译他,这将忽略任何带双下划线关键词。

解决方案:微软发现了一个解决方法来改变这种语言而不是替换这种语言。但是这种妥协带来了以下结果:

1、研发者发现这种语法不自然而且看上去也很不舒服。

2、不能尽其所能。

例如,下面是托管C 声明属性的例子:

public __gc class Foo

{

// hundreds of lines of code

__property String* get_Text();

// hundreds of lines of code

__property void set_Text(String*);

// hundreds of lines of code

};

我相信,有良好编程习惯的程式员会将get和set紧挨者使用,并且会紧接着又声明任何下面需要使用的变量。但是语言并不管这些,他不能提供封闭的括号来界定结构,来让您声明"这是个作为单元的属性"。所以当他运行时显得不自然并且和其他.NET语言也格格不入。

面对这些您能做什么?唯一的方法是将C 和CLI自然地结合起来,反之也就是真正改变C 。假如您将这么作,一种自然完美的语言将给您带来巨大的自由,当您编程时就再也不会需要双下划线了。

二、生命期和作用域

我很喜欢明确地销毁对象。实际上,我也很喜欢垃圾收集器。可能我要说的更多,事实上,虽然他们有着各地的位置,而且对于我来说都需要,但假如我正在创建的对象仅仅操作内存,假如使用后无需我释放内容我将会很高兴。但内存管理是如此的虚弱无力,当我的对象占用非托管的资源时,例如一个数据库连接,一个文档对象或类似的对象,我需要自己控制。我需要确认一旦无需的时候他就消亡。Dispose模式试图处理这些情况,但他并不是自觉的行为。封闭的括号也许是一种很好地解决途径。

在普通的非托管C 中,以下的代码说明了您不得不做的工作:

//this is a code fragment

{

try

{

Foo* f=new Foo(/* params */);

//all kinds of code, some of which might throw exceptions

delete f;

}

catch (/* something */)

{

delete f;

//whatever else, or rethrow;

}

}

假如在堆上创建对象显的是那么的容易:

//this is a code fragment

{

Foo f;

//all kinds of code, some of which might throw exceptions

}

当变量f超出作用域,无论是否是因为异常,他都自动消亡,这很自然而且令人高兴、满意。

当这个对象在托管堆上,您无需删除他,他将被垃圾搜集器清除。但是,假如他占用了一个托管资源,您可能想通过Dispose()方法来清除他,C#为这么做提供了using构造,但是他仍然不象我们的堆例子那样简单。

在新版本的语言中(以前叫C /CLI),您能够不依赖于对象的种类来创建他,您能够在堆上创建一个托管对象,并且他能够在超出作用域后明确地被销毁。假如愿意的话,您还能够在托管堆上创建,这完全根据您的选择而定。

这种变化带来了其他的后果。最具深远意义的结果是您能够轻松地将任意对象放入模板集或作为另外一个类的成员变量。您能够充分发挥C 的力量来管理对象的生命期,而不是仅仅在堆上分配他并等待垃圾处理器来处理。三、析构和终结

当您书写一个能够被其他语言使用的垃圾收集对象时,将发生什么?您针对这个对象是否已写了一个析构函数?当您正在使用C ,您能够在堆上创建对象,当超出作用域范围后,对象的析构函数将自动运行。当C#或VB应用(不能在堆上创建垃圾收集对象)使用这个对象时将发生什么?这种情况被以一种精巧的方法实时处理。他将对象的析构函数转换为Dispose()方法来使用,所以,拥有析构函数的C /CLI对象都能够任意使用。

假如您用C#或VB写了一个带有Dispose()方法的类,您可能已写了一个终结函数,对于终结函数C /CLI也有一种很简单的语法。就象foo对象的析构函数叫做~Foo()相同,foo对象的终结函数叫做!Foo(),这两种方法都提醒您他们和构造函数相反。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 使用VC ATL实现Office的COM插件(1)

下一篇: 挑战30天C 入门极限-引 言