寻找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语言是面向过程,主要单位是函数,变量和函数的 ...
随机推荐
- curl常用选项详解
curl常用选项详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 又是下班的时间了,让我们一起来学习一下今天的Linux命令吧~我一半只把自己常用的参数列出来,其他的有但是我们几 ...
- U盘文件偷窃程序
// Drives.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "windows.h" #incl ...
- ligerui_ligerTree_005_动态增加“树”节点
动态添加ligerTree节点:效果图: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 <%@ page language= ...
- gulp详细入门教程(转载)
本文转载自: gulp详细入门教程
- Java集合---ArrayList的实现原理
目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 6) 调整数组容量 ...
- js实现继承的五种方式
function Parent(firstname) { this.fname=firstname; ; this.sayAge=function() { console.log(this.age); ...
- Boadload和Image$$??$$Limit含义
Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码.简单的说它们都是bootloader,所完成的任务也大同小异. 熟悉x86体系结构的朋友肯定知道,x86平台上bootloade ...
- 连续最短路算法(Successive Shortest Path)(最小费用最大流)
#include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...
- zigbee学习之路(二)点亮LED
一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...
- linux服务器默认连接数配置
vi /etc/security/limits.d/90-nproc.conf * - nofile 65536* - nproc 65536root soft nproc unlimited vi ...