C# vs. C++/C : 从技术管理角度的分析(附: .Net 在桌面领域的潜敌分析)

简介:

    产品是由一系列属性组成,如,价格,性能,可移动性等。对于程序开发语言来说,就是性能、开发速度、可维护性等。对于产品的某个属性,并不是这个属性越高越好,只要足够高就行了。绝大多数人绝大多数场合,对产品的要求不是要求它“最好”,只是要求它“足够好”。当足够好之后,人们就会去关注其它的属性。

    举例子,就拿人来说,吃东西,不是吃的越多越好,当人吃饱了,就会想别的花花肠子,所谓保暖思淫逸。拿电脑来说,当一个电脑性能足够用之后,我们可能就会要求它可携带、便携,当可携带之后,我们的关注点可能就是待机时间或其它要求了。

    因此,本文的立足假设就是:市场上对一个产品的某项属性要求有一个满意线,超出这个满意线,就可以被市场接受,此时,不同产品之间竞争的主战场就会切换,从一个属性变化到另一个属性。

image

    而市场是多样化的,每个市场对属性的要求不同。我简单的画一张图(上图),这个图上横坐标是时间,纵坐标是程序的性能。为了简化讨论,在这里只谈性能,至于其它的,用类似分析方法可以分析。一般来说,随着时间发展,程序的性能是逐步提高的,我们就假设C#的性能低于C++,是对方的0.X倍。这里假设有4个市场A、B、C、D,4个市场对程序性能的需求不同,A要求最高,B其次,C再其次,D最没要求。市场对性能的期望也是上升的,常见的情况就是上面的模式:市场对性能的需求是逐步上升的,产品的性能也是逐步上升的,但后者上升的比前者快。

    上图中有3个时间点。在时间点1,C#还没出生,C/C++的性能可以满足D市场的需求,哈哈,这时候,D市场里的技术人员纷纷选择C/C++开发,这时A、B、C市场上的开发人员没办法,只能一句一句汇编的写。在时间点2,C/C++可以满足A、B、C、D四个市场的需求了。C#也发展到可以满足C、D这两个市场的需求了。此时,C、D两个市场上的技术人员,在选择技术时,就不再关心C#的性能问题,他们的关注重心是性能之外的事情,而C#在快速开发、可维护性上要优于C/C++。此时,选择C#就是正确的选择。而A、B两市场上的开发人员则绝不会考虑C#,因为性能不过关。时间继续发展,到了时间点3,B市场的一些先行者突然发现,C#可以满足他们的性能要求了——于是,C#又蚕食掉了C/C++的市场C。

    当然,世界中的事情比这复杂的多,这幅图只是简化之后的阐释。上面这些文字,最核心的2个意思是:

    (1)我们对大多事物的要求只是足够好,不是最好,当一个方面足够好了,人们的关注点会迅速切换到其它方面去;

    (2)由于市场之间的交叉性很差,致命的竞争对手往往潜伏在别的领域,而不是目前正在正面竞争的技术。

    对于第(2)点,再画一张图来解释:

image

    这张图上只有两个市场A、B,这两个市场相隔甚远。有甲、乙、丙三种技术,在时间点1,只有甲、乙两种技术能满足A市场的需求。于是甲和乙两种技术缠斗不休,打呀打呀打呀,打到时间点2。这时丙技术虽有发展,但还是不能满足A市场的需求,A市场上没有丙技术的影子。甲和乙眼里只有对方,仍然互相踩啊打呀骂啊。到了时间点3了。甲和乙依然还在打啊打啊,这是A市场发现,丙技术能满足他们需求了,此外发现,丙技术还具备甲、乙技术所不拥有的其它优点。然后丙技术很快在A市场上传播开了,甲技术和乙技术傻眼了…… 市场的急剧变换就是这样发生的。想想摩托罗拉是怎么衰落的?

    换到C/C++/C#可以推断,C#会对C/C++的现有市场逐步蚕食,从D到C到B到A……

    但是——

    (1)考虑到现有的在C/C++上的投资,并不一定会完全的转移到新技术上去

    (2)其它市场,如嵌入式这一块如今发展凶猛,在这一快速发展的领域,C往往是最先满足需求的技术(如性能,内存占用,编译器的复杂程度等),C++是其次,C#是最后。因此表现就是,C#蚕食C/C++的老市场,C/C++不断的进军新市场。如果C/C++扩张速度大于被蚕食速度,那么在语言的份额上,C/C++依然是逐渐扩大的。

    具体我们在技术的选用上,就要看这个技术是否在某方面已经足够用了,然后多方面考虑进行决策,而不是这个技术是不是最NB的。

=============

    本文最想说的不是上面这些,而是下面的——

    螳螂捕蝉,黄雀在后。C#在蚕食C/C++,但有一个潜在的对手,可能威胁到.Net在桌面开发的未来地位。而目前,绝大多数人对这个潜在的敌人还不甚了解。本文重点就是介绍这个潜在的对手。

    这个潜在的对手就是Flash。Flash的主流市场是网络广告,然后是视频网站,这个市场和桌面开发完全是不沾边嘛!但是——请听我一一道来:

    (1)Flash是一个虚拟机平台,跨平台的,还可以在很多手机上应用。我们以前可能觉得.Net是平台,Java是平台,但Flash也是一个平台,这三个平台之间没有啥本质的区别。Flash理论上也可以支持多语言,事实上,相关项目已经启动了。Flash/AIR可以运行在桌面。

    (2)Flash的主流语言as3很强大了,已非昔日阿蒙,除了语法略有不同外,它几乎是和C#最相似的语言。有属性,有事件,有function,有接口,有异常,有比较强悍的静态类型系统,也有动态类,有反射,有Remote(as3的Remote非常好用的!),当然,缺乏的也不少,最主要的是缺泛型。as3性能也很不错,我简单的测试结果是Flash程序大约相当于sl程序性能的80%,而不用unsafe,sl性能和wpf是相当的。重构啊,单元测试全部都支持的。

    (3)在UI上,和Flash/Flex对应的是WPF+Silverlight,不是Silverlight。目前Flex已经是4.0了。至于Html5,现在还在打酱油,本文除了这句话外,再也不会提及它。

    (4)在IDE上,Flash Builder已经很好用了。此外还有古老的Flash和新生的Flash Catalyst。Flash现在是有3个不同定位的官方IDE,可满足于不同的需求。

    下面,就以一个简单的Hello World来演示一下Flash开发和.Net开发的相似性。

image

    上图是Flash Builder。由于是在Eclipse基础上开发的,有过Eclipse使用经验的可以快速上手。同时,它的开发模式和VS下WPF开发是非常类似的。而WPF在VS2010之前还无法拖控件,Flash Builder(Flex Builder)很早就可以拖动了。同时,Flex也提供了很多现有控件的。上面,我拖了2个控件,一个Label,一个Button。然后在Size and Position中,我设置了这个button的定位约束在右下方。

image

    上图是官方的控件。常用的都有了。

image

    上图是属性面板,里面列了button的属性和事件。带“闪电”图标的是事件。双击即可自动产生方法。比如,双击click,可产生:

protected function button1_clickHandler(event:MouseEvent):void 

}

    点击时让label显示helloworld,可在方法体中添加:

this.txt.text="Hello world.";

    到现在为止,只写了这一行代码。然后运行,可以得到:

image

    下面是完整的代码:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="
http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

    <fx:Script> 
        <![CDATA[ 
            protected function button1_clickHandler(event:MouseEvent):void 
            { 
                this.txt.text="Hello world."; 
            } 
        ]]> 
    </fx:Script>

    <fx:Declarations> 
        <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/> 
    <s:Label x="42" y="48" id="txt"/> 
</s:WindowedApplication>

    Flash的数据绑定非常简洁。改写成数据绑定版本:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="
http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

    <fx:Script> 
        <![CDATA[ 
            [Bindable] 
            
private var message : String; 
            protected function button1_clickHandler(event:MouseEvent):void 
            { 
               this.message = "hello world"; 
            } 
        ]]> 
    </fx:Script>

    <fx:Declarations> 
        <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/> 
    <s:Label x="42" y="48" text="{this.message}"/> 
</s:WindowedApplication>

    这些年来,Flash在悄悄的布置阵地,现在这个阵地已经成型了。由于关注于UI,这个虚拟机很小,语言也很实用很轻量级。部署在桌面的话也只是10M上下,而类似的WPF程序的部署大小是30M-40M。同时,还是跨平台的。并且,浏览器应用和本地应用之间的差异很小。开发速度也很快,比.net的开发慢不了多少。http://www.taaz.com/makeover.html 这是一个非常NB的Flash Web程序,我只用了5周时间就已经实现了它除了自定义模特之外的主要功能!

    目前Flash还有一些非常大的缺陷,如虚拟机的成熟度仍然不够,还有桌面程序目前还不支持本地调用。前者依靠时间来完善,后者也需要等等。如果这些实现了,将是C#在桌面上的极大的威胁!但目前,.Net还很不在意Flash的存在,大家头脑中想起Flash依然还是漫天的网络广告。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/06/23/1763699.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
2月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
163 3
|
5月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
172 0
|
7月前
|
SQL Java 测试技术
C#字符串拼接的6种方式及其性能分析对比
在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet进行性能分析对比。
103 6
|
9月前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
248 18
|
9月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
109 11
|
9月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
249 12
|
9月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
134 10
|
9月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
122 6
|
9月前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
118 6
|
9月前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
118 6