找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 807|回复: 1

[原创]:在.Net架构中我们还需要VC++吗

[复制链接]
发表于 2002-5-13 22:39:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在.Net架构中我们还需要VC++吗
在提出这个问题时我也是迷惑的,我们在C#诸多优点的光环下VC++似乎已离我们越来越远了。
当然我们这里说的VC++指的是遵循C++语法的Managed VC++,不过我们可以先来看看.Net Managed下的C++(下文C++即指managed C++)与C#的一些语法比较。
1、 C#是完全Managed的,而C++则不然。一个C#编制的assembly用VS提供的工具Depends看,它永远是只依赖于一个动态库mscorlib.dll,如果想要调用unmanaged代码只能通过COM接口和DllImport;而C++中调用unmanaged代码除了C#可以使用的方法外,还可以使用unmanaged C++中可以使用的任何一种方法,换一句话说VC++中是可以managed代码和unmanaged代码显式共存的。比如我们想要在C++中调用WIN32 API可以和以前没有任何区别,只要#include <windows.h>就OK,只是我们再用Depends来看这个assembly时发现又出现了我们熟悉的kernel32.dll之流了。了解了这一点,在下边的文字中我就基本不再提unmanaged C++,同时对C#的一些语法不作过多解释,因为主要侧重讲的是C++,毕竟我们都是传统C++程序员。
2、 C#中对象(C#中可是全是对象,我的感觉是确实方便)分为值类型和引用类型;C++的类则分为值类和垃圾收集类(注意C#中我用的是“类型”这个词,而C++我只用了“类”一个字)。垃圾收集类就是在类前边加一个__gc(曾记否,AutoLISP中有个(gc)东东),而值类就是在前边加一个__value,如:
__gc class CDislike
{
}
__value calss CDistaste
{
}
__value struct CDisgusted
{
}

在C#中struct是值类型的,class一定是引用类型的;C++中的值类好象范围拓宽了,无论是class还是struct都可以是值类,其实在两门语言中是一回事。在C++中class和struct的区别大家都知道,再说一加__value就不能作为其它类的基类,也不能从别的类派生(除.Net默认基类),所以两种语言是一样的,但C++新增了这两个关键字,我怎么看怎么别扭。
3、 Boxing和Unboxing是.Net中的一个新特性,如果忽略Boxing中的内存复制过程,可以简单理解为C++中的强制类型转换。如 C#中:
Int ii=1;
Object obj=ii; //box
Int jj=(int)obj; //unbox
但C++中可就烦透了,不能象C#中逮个东东就可以ToString,连12.345.ToString()都正确得不得了,看C++中MS又给我们带来了一个关键字的用处:
__value struct C1
{
int nValue;
};
void main()
{
C1 c={10}; //c.ToString()就错了
Console::WriteLine(__box(c)->ToString());
}
4、 数组:
C#: int []nArray=new int[10];
Unmanaged C++ int *pnArray=new int[10]; 或者 int nArray[10];
Managed C++ int nArray __gc[]=new int __gc[10];
5、 属性的比较。假设我们要设置一个Length的属性,有一个成员变量为 int m_nLength;
C#:
public Length
{
get
{
return m_nLength;
}
set
{
m_nLength=value;
}
}
C++:
pubclic:
__property int get_Length
{
return m_nLength;
}
__property void set_Length(int nLength)
{
m_nLength=nLength;
}
从上边我们可看出来,结果就是C++比C#多两个函数可以用,且用到一个关键字__property。
6、 C++还有一个别针型指针,关键字:__pin,作用就是固定住一个managed内存段,别让它在传给unmanaged时让CLR给释放掉了。这个东东当然C#是没有的,C#的指针毕竟仅仅是unsafe而不是unmanaged。
7、 宏。虽然C# 保留了宏,但是不能对宏指定确定的值,这是很明显的,因为一个全对象的语言不会允许和C++的宏一样的东东存在。
8、 友元。C++中没有了友元就意味着有一些不想在assembly中对外开放的方法或函数也只能开放(设为public),不然在同一assembly中别的类想调用这些方法时就没办法。而C#中碰到这样的问题时,internal就会挺身而出。
9、 类型判定。基于.Net的类中,二者有相同的从Type而来的方法。另外C#提供了新的关键字:as 、is等,让类型判定变得很方便;而在C++中我们有时候还不得不用dynamic_cast等等。
10、 可视化设计。VS的着眼点就是V,可是用VC++作.Net程序可就V不起来了,它不能象C#那样几个Drag 、Drop就能搞掂一个Form,这时候有人问了,那不V的C++该怎么办?!这很明显嘛,全部手写喽,写完后编译成功,再运行一把,你就能看到自己设计的Form是什么样的了。还有一个“简便”方法就是用C# Drag、Drop后的.cs再翻译成.cpp,不要以为没人这么干过,我就是其中一个。
11、 另外一个地球人都知道的就是C++不能做Web程序,也是VS中唯一不能做Web程序的语言。那ISAPI、ATLServer等等算不算呢?别忘了,这些都是unmanaged。

看了上边的比较,我想大家对VC++.NET在开发中是否需要应该有一个自己的看法了,希望大家都能发表自己的观点。我个人以为,当我们在MS.Net怀抱中与C#共浴爱河的时候,可不能忘了曾经的挚爱。做窗口程序和Web程序我们肯定不会选用C++,但做一些assembly时C++有时候还是很方便的。对于C++新增的那几个关键字吐啊吐啊也就会习惯了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2002-5-14 07:32:38 | 显示全部楼层
精彩,希望更多这方面的高手给我们讲讲。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 01:39 , Processed in 0.376530 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表