一提到C语言,在偶这个始终的C语言菜鸟眼里,是个神奇的语言。经过了近半世纪的历史,多少技术湮灭在信息时代的长河中,C语言却依然在TIBOE排行榜中笑傲群雄。

本文是谈.NET开发者看来,C语言有什么特点,我们能从C语言中了解些什么。个人觉得,C++过于复杂了,和.NET走的完全是两条路,对我们没有多大可借鉴启发之处。

操作系统和硬件驱动主要都是C语言编写的,比如Windows系统。C语言可以自由地通过嵌入系统头文件,调用Windows函数,创建窗口,画图操作文件等等。而.NET要调用这些函数,必须像这样声明:

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int MessageBox(HandleRef hWnd, string text, string caption, int type);

 user32.dll其实就是对应winuser.h,函数名和参数完全一样。但C#必须先查好或记住这些名称参数,所以显然比C语言待遇低了一级。不过一般情况下,调用这些底层函数都被.NET Framework封装了,比如命名空间System.Windows.Forms下的UnsafeNativeMethods类。

C语言声名着著是其体积和速度,既因其高效,也由于其简单。我们可以体会和现代编程语言原始风味的方案。

C语言为什么那么重视链表,而.NET的LinkList类从没人用过,因为C语言从一个数一个字节地解决问题,而.NET立足于一个个对象

没有异常,就用不同的返回值表示处理结果。 那处理的数据怎么办?用全局变量,或用参数传址。

没有越界检查,保持逻辑正确,程序自助解决,可以利用这点写更精巧用法,比如实现函数的可选参数。这更多地导致了无数缓冲区漏洞等安全问题,想得到高效又要安全,就只有在代码上付出更多。

C语言类型系统十分简单,就是按占字节数,1个是char,2个是short,4个是int。没有枚举和true/false。其实所有变量,所有类型,在C语言视角,都是一个字:数。

没有泛型,反正类型都是数字,传什么都行。

没有委托/事件,有函数指针,至于签名是否匹配,自助解决。

C语言也没有一个各个平台通用的标准库,提供标准的string和集合类型。C语言出现那时,都没有Unicode这种概念。在Windows库中,同义类型泛滥,光表示string的就有好多种,如WCHAR, PWCHAR, LPWCH, PWCH等等。

没有继承,C语言开发在有一些业务逻辑的系统就显得笨拙。

C语言还有一些奇怪的脾气,比如变量和函数声明要放在最前面,函数不能返回指针或数组(因为只在函数栈上可用),久之就习以为常了。相比于现代编程语言,都是组织严密,无懈可击,但觉得似乎千篇一律,少了一点个性。

我建议.NET开发者,如果只上过C语言大学课,无论何时重温一下它的思想,会让你的思维都会变更加全面。

C语言应用领域仍然海阔天空,应用比.NET要广得多,但就不同的每个平台(Win/Unix/Mobile)而言,又要比.NET少得多,跨度要比Asp.NET到WPF开发大得多。所以至少从这方面讲,做C开发不比.NET幸福,但做这种开发的,几乎每个都是精英,一直为这些复杂的网站,管理系统, 各种App背后,默默地提供坚强支持。

posted on 2013-12-20 18:57  小城故事  阅读(3951)  评论(4编辑  收藏  举报