C#抢鲜快报之FAQ20
q1.问:搞了这么久,我一直都没弄明白,.net是运行库呢还是开发平台哪?
答:都是!并且还不止这些呢――微软的宏伟目标是让microsoft.net彻底改变软件的开发方式、发行方式、使用方式等等,并且不止是针对微软一家,而是面向所有公司!今年7月份在pdc展会上分发的是“.net架构”包,“.net架构”是microsoft.net计划中首先问世的一部分,它包括了两方面的组件:“.net通用运行库”和“.net类库”。最近传来好消息说这两个组件已经被打包到“.net架构sdk”中,放在微软的站上免费供大家下载,有兴趣的朋友一定要去试试看哦!另外,这个sdk中还包括c#、c++、javascript和vb的命令行编译器,使用这些编译器就可以开发应用程序和组件了,从这个角度来看,.net架构首先是一个开发平台,因为它提供了运行库和类库,并且,下一个即将面市的就是visual studio.net,其中包括了更加全面的sdk和图形化的开发界面、向导、工具等等,更象一个开发平台了。但是.net的运行库其实已经融合到操作系统中,所以说它为运行库也是可以的。
q2.问:c#成为一种通用性语言的可能性究竟有多大啊?我的意思是说,不仅仅是微软一家支持的语言。另外,如果真是这样,现在有否其他软件公司承诺在非windows平台上提供c#的编译器呢?
答:这个问题现在来回答还有点为时尚早。反正我就是喜欢用c#来编程!(晕倒...)因为它十分类似于c++,所以学起来几乎不花什么时间。微软现在已经将c#提交到ecma标准化组织,如果获得通过,那么任何一个公司都可以开发出c#的编译器。不过,设计c#语言最初的目的就是要将它作成一种完全依赖并且完全兼容于通用语言运行库的语言,没有运行库的支持,c#是不会如此强大的。要在其他平台上开发编译器很容易,但是移植运行库就是一件大工程了。
q3.问:能不能讲讲c#在哪些具体问题上比java有优势?
答:虽然大家很有诚意地看着我,但是我还是想告诉大家:我没学过java!不过,我不妨说说c#和c++的差别:c#有更简单的语法,紧密集成的组件和函数,类型安全等等。要是想知道c# 和java的区别――去问别人吧,别问我。
q4.问:在c#语言中访问数据库,使用ado+是不是最好和最有效的方法?或者c#的运行库中有更好的oledb api封装函数吗?
答:.net类库中包括一个名叫system.data的名字空间,其中就有很多访问数据库的类。c#程序员可以很方便地利用这些类来访问数据库,不需要用到ado+。
q5.问:c#可不可以开发windows程序?不会只能开发分布式应用吧?
答:当然可以!c#可以开发任何古典风格的windows程序。不仅如此,不管是控制程序、图形程序、nt服务程序,还是普通组件,甚至是web页面,除了硬件驱动程序,都可以用c#开发出来。实际上,这些功能都是从运行库中实现的,而 c#语言本身并不提供。
q6.问:c#和winforms之间是什么关系?
答:winforms是.net类库中的类集,其中封装了win32类中的windows,brushes和pens类等等。任何使用了运行库的语言(包括c#)都可以建立这些类的实例并进行控制。就我所知,winforms和j++的wfc类库有些类似的地方。
q7.问:传闻c#已经被提交到ecma标准化组织等待批准,是吗?
答:对!到q2去看看吧。
q8.问:atl和com在.net新技术中会扮演怎样的角色呢?
答:.net架构中取代了很多老技术,象atl、mfc、c运行库、标准模板库(stl)等等类库都不再出现了。.net统一了编程类库,开发起来比使用这些老技术容易多了。我猜很多程序员看到.net的这些优势后会义无返顾地选择离开老技术的。不过,老玩意还是有一定的优点的:它的性能相对来说比较好。如果你需要特别突出性能,那么还是可以继续摆弄这些老玩意的。另外,对于com来讲,用.net来开发相同功能的组件会比以前容易几个数量级,并且还能轻松搞定各个组件之间常常出现的互操作性要求。目前在.net代码中还不能直接使用com+和交易服务,但是可以通过间接的方法来使用,只不过在性能上要打些折扣。
q9.问:为什么c#没象c++那样提供模板功能?
答:啊……啊……又来了,再说一遍好啦,模板其实应该是运行库提供的功能,不关c#语言的事。在c#中没有提供模板功能大致有两点原因。首先呢,执行模板有一定的困难,所以微软没打算在c#的第一版中提供这样的功能,以后的版本中会有类似的功能出现的。其次呢,因为这里的运行库是支持多语言的运行库(不仅仅是c#),如果在运行库中引入模板,就意味着所有使用这个运行库的语言都必须支持模板功能,在这一点上,微软不得不慎重考虑,所以也不打算现在就把模板加进去。
q10.问:在c#中会不会用真正的关键字换掉那些把atl和com搞得乱糟糟的伪关键字?象什么ole_color、bool、variant_bool、dispid_xxxxx什么的,烦都烦死了。
答:这个您放心,绝对要换!每种类型在.net类库中都有新名字了。
q11.问:我们现在看到了有限制程序的扩展和改善,除此以外,将来c++在ms或者.net中的地位又将如何?
答:c++语言在微软的各种语言中是最独特的一种,它也是唯一可以允许程序员开发无限制低级程序的语言。所以,我们常常可以看见程序员们用c++写性能要求较高的无限制的算法代码,同时也用c++编写有限制的安全程度很高的组件代码。我认为微软会继续保留c++的现状,并维持很长一段时间。毕竟,驱动程序需要它,windows的基础也是它,很多产品也使用它。
q12.问:既然.net支持activex/com,那么如何才能保证一个运行在浏览器中的c#程序的安全性呢?
答:.net运行库提供了代码访问安全特性,它允许管理员和用户根据代码的id来配置安全等级。在缺省情况下,从internet和intranet下载的代码都不允许访问任何本地文件和资源。比方说,我写了个程序把它放到网络上,然后让它在网络上的共享目录中运行,如果它要访问我本地的一些资源,那么它将会无情地被异常扔出去,呵呵,当然,如果拷贝到本地硬盘上运行则一切正常。
q13.问:在我的机器上有c#程序,那么我是不是需要安装了.net运行库才能运行它?
答:对。所有的有限制程序都需要一个管理程序来限制它们;在这里,运行库就是管理程序。微软在以后将会把运行库打包起来免费分发,而现在最终用户必须从msdn上安装整个.net的sdk包才能运行c#。
q14.问:有人曾经提到过,c#的类可以从vb中声明的类中派生出来,是不是真的啊?哪里有这样的例子程序呢?
答:确实是真的。实际上,只要是使用运行库的语言,都可以做到在一种语言中声明类,而在另一种语言中派生类。并且,visual studio的调试器将会完全支持跨语言的程序调试,在函数堆栈调试窗口的每个条目中都会显示堆栈中的函数是什么以及它们分别用何种语言写成;另外,你甚至还可以跨语言地处理程序中的异常错误。这种特性确实棒极了,在pdc上演示这段功能的时候,大家都热烈地鼓起掌来。在.net的sdk中有例子程序演示其做法,十分简单。
q15.问:那能不能从c++类派生出c#类来呢?如果可以该怎么做?
答:上面提到过,如果你使用有限制的语言,那么自然就可以,不过要是你使用c++中无限制的部分,就不行了。
q16.问:新版本的mfc可以选择在限制环境下运行吗?
答:我平时没怎么关注mfc,不过我可以确信答案是否定的。mfc从来都没有被限制过。对于限制程序,大家应该使用winforms来管理。
q17.问:如果新版的mfc能够在一个有限环境中运行,它是不是可以在不需要.net运行库的情况下建立win32桌面应用?
答:我敢肯定mfc不可能这样,并且它从来都不需要什么运行库。
q18.问:有人说“c#只是微软windows另一种特有语言罢了,其他平台是不能用的”,你同意这种说法吗?
答:c#是针对“通用语言运行库”(clr)而开发的,而不是针对windows。如果运行库被移植到其他系统上,那么c#也可以被移植到那里。
q19.问:传闻vb7中可以象mfc那样建立运行库的静态链接,是不是真的哦?如果是真的,那c# 是不是就可以创建可以单独运行的程序了呢?
答:绝对假闻。没有哪种语言可以创建运行库的静态链接。
q20.问:c#使用资源文件吗?如果不是这样,它采用何种机制让用户定制程序呢?
答:.net架构设计器采用了一个新的资源模型。资源数据可以象win23一样嵌在exe或者dll文件中,也可以以独立文件的形式存在,比如一张bmp或者jpg图片。限于篇幅,这里就不再赘述了。