寻找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语言是面向过程,主要单位是函数,变量和函数的 ...
随机推荐
- Latex常用指令学习
1:\begin{}与\end{}的用法 2:\textcolor{red}{\fangsong\zihao{2}汉字:} 3:\newpage 新的一页 4:\heiti\zihao{4}\bf{ ...
- 1.1 C#简介
大家好,这是我的C#(读做 "C sharp")学习之旅,先简介一下我了解的C#吧! 首先,说到C#,就不得不提到微软的.NET..NET是微软推出的软件开发和运行平台,允许应用程 ...
- Java语言中,类所拥有的“孩子”,他们的关系是怎样的
学习了一本有关Java的书.初步了解了一些面向对象的内容. java是由一个个的类组成的,这些类组成了java程序.类之下有他的孩子,这四个孩子分别是: 成员变量:就相当于一个个的变量,他由stati ...
- 夺命雷公狗-----React---13--事件监听
在react中事件监听直接作为组建的属性来添加即可,就像DOM中的html操作 <!DOCTYPE> <html> <head> <meta charset= ...
- Main.C时钟设定
void Main(void) 时钟设定:400M 100M 50M 得到 1:4:8 进而需要得到 hdivn=2 : pdivn=1: i = 2 ; //用于选择CUP核的频率 ...
- jquery file upload 文件上传插件
1. jquery file upload 下载 jquery file upload Demo 地址:https://blueimp.github.io/jQuery-File-Upload/ jq ...
- java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}
/** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...
- Windows:常见问题
1.文件(夹)非法字符 Windows系统文件(夹)非法字符"\\/:*?\"<>|",不包含‘.’,但"."字符不能是文件(夹)的首字符 ...
- js 多少天以后的时间
/** * 多少天以后的时间 * @param date 时间 * @param num 多少天 * @param type 类型 年 月 天(默认天) */ exports.afterDate = ...
- Uva 11478 Halum操作
题目链接:http://vjudge.net/contest/143318#problem/B 题意:给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权 ...