寻找C语言和.NET之间的桥梁
一提到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背后,默默地提供坚强支持。
寻找C语言和.NET之间的桥梁的更多相关文章
- C语言和C++篇
C语言和C++篇 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的.想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成 ...
- 从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇
转自: http://www.cnblogs.com/wenjiang/p/3266305.html 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的 ...
- CHENGDU1-Python编程语言和PEP8规范
CHENGDU1-Python编程语言和PEP8规范 PEP8规范6条? 答:PEP8规范说白了就是一种规范,可以遵守,也可以不遵守,遵守PEP8可以让代码的可读性更高. 代码编排:---缩进,4个空 ...
- 大数据工具比较:R 语言和 Spark 谁更胜一筹?
本文有两重目的,一是在性能方面快速对比下R语言和Spark,二是想向大家介绍下Spark的机器学习库 背景介绍 由于R语言本身是单线程的,所以可能从性能方面对比Spark和R并不是很明智的做法.即使这 ...
- OWL本体语言和Protege本体编辑器
OWL本体语言和Protege本体编辑器 演讲稿原作者:Wala Abdulaziz译者:Wu Di (pimgeek)转载.编辑:Tan Liwei原文发布日期:2013年6月5号原文链接:http ...
- 很多人都搞不清楚C语言和C++的关系!今天我们来一探究竟为大家解惑~
最近,身边有许多小伙伴已经开始学习编程了,但是呢,学习又会碰到许多的问题,其中作为新手小白提到最多的问题就是编程语言的选择. 每次遇到这种问题,看起来很简单,但是又有很多小伙伴搞不清编程语言之间的关系 ...
- C语言和C++中动态申请内存
在C语言和C++的动态内存的使用方法是不同的,在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> ...
- [原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)
原文:[原创].NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇) 前言:上一篇文章讲述了一些实现DAL的理论,本 ...
- c语言和java的区别
今晚读了一下c程序设计语言,这是一本经典书籍,发现C语言和java有很多是相同的,毕竟java是由c语言进化来的. 我大概从我自己的思考来谈谈不同点 1.c语言是面向过程,主要单位是函数,变量和函数的 ...
随机推荐
- Count Primes ----质数判断
质数的判断 埃拉托斯特尼筛法: 算法的过程如下图所示: 我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,依次类推,直到根号n,此时数组 ...
- node与Elment以及子节点childrenNode与children的区别(2)
测试代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 基于android-async-http的android服务
1:服务器端/** * Created by LiuFei on 2016/1/22. */public class HttpService extends Service{ @Override pu ...
- sql 表分区使用
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- c#委托、事件、Observer
委托和事件在.NET Framework[1] 中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 委托 外文名 Delegate 编程语言 C# 作 ...
- 最快速的Android开发环境搭建ADT-Bundle及Hello World
ADT-Bundle for Windows 是由Google Android官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决了大部分新手通 ...
- :only-child
如果某个元素是父元素中唯一的子元素,那将会被匹配 如果父元素中含有其他元素,那将不会被匹配.(注:这里的其他元素并不包含文本节点,如:<p><img/>图片</p> ...
- http接口测试——Jmeter接口测试实例讲解
摘要: 最近做的项目需要测试很多接口,上网查一查,发现完整讲述接口测试的资料太少,所以最近自己做完这个项目,把测试的东西整理一下和大家分享一下,希望对看到的人有所帮助 一.测试需求描述 1. ...
- objective C 学习之02
1. 函数 -(void) HelloWorld:(BOOL)ishelloworld{ //干点啥 } 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的.对应的有+号, 代表是类的 ...
- LeetCode----172. Factorial Trailing Zeroes(Java)
package singlenumber136; //Given an array of integers, every element appears twice except for one. F ...