VisualStudio2005中C的变化

时间:2007-06-15 来源: 作者: 【字体: 减小 增大收藏 | 投稿
  
下一代visualstudio版本(以前whidbey,现在是visualstudio2005)提供更加丰富的改进的库文件和没有很多幕后精简和加速的压力,它的大量配合的工具和新的功能将使开发者的开发过程变得简单有趣,对我而言,这些与visualstudio2005对C的处理相比就显得有些苍白,这里我主要谈谈在下一代visualstudio中C的变化.

  跟下划线拜拜

  在visualstudio.NET中引入了对C扩展名的处理,扩展名是以两个下划线开始的关键字,比如__gc和__property.自从上个版本发布以来,我已经写了大量的双下划线特征的代码,我坦白也不喜欢这样,我了解具体的原因是:带两个下划线的关键字作为特殊的扩展名使它们不会跟标准编译器相混淆,你可以全面的管理扩展名可以用其他的编译器来编译,它忽视__关键字。

  这是一种解决方法:微软发现了一种方法不改变编程语言的改变,但是会出现下面一些结果:
财软联盟,fs119.net


  ·开发者发现语法不自然

  ·不能被完全的采用

  如例,适当的C处理方法: 程序代码:
public__gcclassFoo
{
//hundredsoflinesofcode
__propertyString*get_Text();
//hundredsoflinesofcode
__propertyvoidset_Text(String*);
//hundredsoflinesofcode
};
  有良好习惯的程序员把get和put放在每个扩展名的右面,把潜在的变量放在旁边,但是编程语言没要求你这样做。它提供无环境支持定界结构让你明白作为一个单元是正确的,所以它是不自然的跟其它visualstudio.NET语言不一样。但是你如何去处理这个问题那,唯一的方式完成C转换成CLR反之就要改变C.假如你想那样做,你可以有足够的自由得到自然一流的语言会给你最好的,你可以取消大量的带双划线的关键字。

财软 联盟 fs119.net

财 软联盟 fs119.net


财管.家园.fs119.net

财.软联盟.fs119.net

  生存时间和范围

  我喜欢确定的解析,实际上我也喜欢碎片收集,我还能举出更多的,它们有自己的作用而且我也需要它们,假如我只在内存中构造一个对象,我希望在我自己清除它前不被清除,

  所以内存管理是很复杂的。但是,如果你的对象包含一个非管理的源文件如数据库链接,一个开放文件,或者类似我要取得一个控制。我想知道它要尽快的离开,用这种模式去处理,但是它不是直接的,简单的亲密支持是最好的办法。

  下面是在原始的C中,你去完成这些事情:

财管家园.fs119.net

程序代码:


//thisisacodefragment
{
try
{
Foo*f=newFoo(/*params*/);
//allkindsofcode,someofwhichmightthrowexceptions
deletef;
}

catch(/*something*/)
{
deletef;
//whateverelse,orrethrow;
}
}

  如果你在堆栈建立对象,生命期是简单的 财软联.盟.fs119.net

程序代码:


//thisisacodefragment
{
 Foof;
 //allkindsofcode,someofwhichmightthrowexceptions
}

  当f超过范围,不论是否是意外它将被清除这是自然的。

  当对象在管理堆里时,你不能把它删除,它将被碎片收集清除,如果你想清除管理着源文件的对象,你可以调用dispose()函数,虽然C#为它提供了的有效的结构,但是它仍然不象堆栈那样简单。

  在新一代的语言(以前是C/CLI),你在哪里建立对象不依赖于你建立对象的种类,你可以堆栈中管理对象,它有确定的解析,但它越界时将被清除,如果你愿意你可以在管理堆里建立对象。

  这种变化带来其它的结果,其中最深远的是你可以把不同的对象放在摸板中或者可以把它看成其它类的成员变量,你可以得到完整的C生存时间周期,而不是仅仅是把它分配到相应的堆,然后等碎片收集来处理它。 财管家园 fs119.net

  解析和定稿

  当你为其它语言写了碎片收集对象是,你是否为它写了解析函数?当你使用C,你可以在堆栈构造对象,解析函数将运行当它越界时,什么事情会发生当其他C#或VB程序调用这个对象,运行时仅从简单的方式去处理,它是用dispose()来解析,任何一个C/CLI对象都有一个可以任意调用的解析函数。

  假如你在C#或VB中有dispose()的类,你可能已经写了一个定论,C/CLI也有简便的语法为定论,就象Foo的解析是~Foo,Foo的定论是!Foo(~是比特的not,!是逻辑的not,它们都是提醒是和构造函数对立的),

  Finalizer将运行当在管理堆中建立而不被调用,确信它所包含的非管理源文件被清除,即使其他调用函数忘了去解析。

  指针和句柄

  在C扩展名管理中,C的主要限制没有变化,同样的符号和语法用做完全的事情,*的含义依赖于你的代码中的其他位置的信息,你可以试试下面的代码:

财管家园 fs119.net


Foo*pf=newFoo();
  Foo对象将在哪里建立?那块内存是否被清除?我能象下面那样对指针做算法吗:

  pf;

  答案依赖于Foo是否用__gc关键字声明,假如它是碎片收集对象,它只能在管理堆不是在本堆和堆栈中建立,另一方面,如果没有用__gc声明,将在本堆中分配内存给它,你必须记得去清除它。

  如果编译器有自由去改变语言,就象在C/CLI上发生的,可以忽视什么地方生存的什么类型的类,可以用不同的语法表明它在哪里生存:

Foo^hf=gcnewFoo();
  这被叫做句柄,许多C团队好象都是用^符号来标明的,你可以用*和->来解除句柄的引用,你可以从实例的声明而不是回过头从类的声明中得到生命期的声明。例如:
财管,家园,fs119.net

程序代码:


refclassR
{
 private:
  intm_a;
 public:
  R(inta):m_a(a){}
};

  你可能会认为ref是C/CLI新的关键字,但它不是,“refclass“是关键字,你可以有变量是ref而不会引起混乱,其他的关键字还有”valueclass“,”interfaceclass“,”enumclass“,几乎过去所有的C程序都会有value这个变量,我很高兴value没有变成关键字。

  Refclass是一个管理类,一个被设计成生存管理队中和被碎片收集管理的类,象我前面所示的你可以在堆栈中声明一个实例,编译器会帮你找到它,加上不可见的智能指针。

  特性

  有很多C特性的改变,因为我是用C比较笨拙的特性开始的例子,所以我现在关闭比较相近的C

财软联 盟 fs119.net

程序代码:
refclassR
{
 private:
  intm_Size;
 public:
  propertyintSize
  {
   intget(){returnm_Size;}
  voidset(intval){m_Size=val;}
 }
};
Rr;
r.Size=42;

  property是一个关键字吗?有点象,它是一个位置关键字,所以你可以有property的变量和函数,而不会引起混乱,它只会在类定义中有特殊的含义,现在在C/CLI中有单独的单元提供特性定义,我很喜欢这样,相信你也是。 财管家,园,fs119.net

财管,家园,fs119.net

财软联,盟,fs119.net


相关文章
  • VCGDI编程的字体和文本绘制
  • 用VisualC.NET进行GDI编程
  • VC.NET实现应用程序XP风格
  • 用VisualC.NET实现XML解析
  • VC.NET中使用Windows.Forms
  • VC.NET2003代码优化方法
  • VisualC.NET中的字符串转换方法
  • 在managedC应用中使用ADO.NET
  • VISUALC6.0在MDI主框架窗口中添
  • VisualC2005中混合代码的初始化
  • 体验VisualC.NET2005中的STL
  • 用VC.NET制作启动屏幕的新方法
  • VisualStudio2005中C的变化
  • VC.NET中定义和使用MFCDLL
  • VC.NET的Direct3D极速入门宝典
  • VC.NET开发环境整合技巧
  • VisualC.NETDirectShow编程
  • 基于VC.NET的GDI编程之CImage
  • 基于VC.NET的GDI图像处理
  • 利用VisualC实现AVI文件的图像截
  • VisualC.NETGDI编程基础
  • VisualC.NET编程讲座之八
  • VisualC.NET编程讲座之七
  • VisualC.NET编程讲座之六
  • Google.cn搜索关键字: 变化 可以 对象 Foo 管理 一个 关键字 of 清除 解析 class
    Google.cn搜索相关文章:
    谷歌中搜索全球网 VisualStudio2005中C的变化
    百度中搜索 VisualStudio2005中C的变化
    谷歌中搜索www.fs119.net VisualStudio2005中C的变化
    上一篇:VC.NET中定义和使用MFCDLL
    下一篇:用VC.NET制作启动屏幕的新方法

    精品课程推荐


    相关栏目
    热点专题
    最新主题
    推荐大折扣培训课程