C#精读研习摘要

  1. 云栖社区>
  2. 博客>
  3. 正文

C#精读研习摘要

厉力文武 2018-08-03 15:34:32 浏览1553
展开阅读全文

    C面向过程、golang半对象化、C#、C++和java都是纯纯的面向对象的计算机开发语言,纯到main都静态在类里,纯到没有全局变量的概念,纯到方法不能脱离类独立存在,面向对象的编程思想是计算机发展历史上的一次革命与突破,与面向过程的编程思想相比无所谓孰优孰劣,每种语言都有自己的亮点和槽点,结合几种主流语言聊聊它们和C#的一些逗比差异。

    1、判断表达式:在if、while、do ... while、for语句中C认为0为false其他为true,C++为了向下兼容作了隐式转换,C#和java中一定要用布尔表达式,把非零值当做真有时候可能只是一厢情愿。

    2、分支语句:C#要求每个分支必须break或者goto,其他语言中那种自动向下遍历分支的功能在C#中被终结,使用中需要特别注意。

    3、foreach语言:C完全不支持,C# 用法foreach(类型 变量名 in 表达式),java用法foreach(类型 变量名 : 表达式),go用法for _, v := range x {fmt.Println(v)},C#和java的区别在于in和冒号,go的循环语句最强大,匿名变量自动指向下标。

    4、函数返回值,go语言支持多个返回值见下面用例,C、C++、C#、java均不支持,golang轻松完胜!

    type GoDate struct {

        year int

        mon T.Month

        day   int

    }

    func (d *GoDate) GoDateNow() {

        d.year, d.mon, d.day = T.Now().UTC().Date()

    }

    5、ref、out和params:这几个关键字是C#独有的,以ref声明的变量以地址方式传递,作用在之上的操作结果都会直接反映到调用一方,以out声明的变量明确表示需要从中看到返回结果,根本目的还是解决单一返回值的限制,params本质是一个object数组类型的list,各种语言都有各自变通的解决方式。

    6、unsafe关键字:C#独有用于指定一条或者一块非安全的上下文,超赞C#的这点设计,使得对指针的应用可以得以延续,在做java开发的时候时常让人怀念指针真是个好东西,golang中保留了指针概念甚是令人欣慰。

    7、fixed关键字:C#独有用在非安全上下文中,功能类似于const类型常指针但更强大,保持指向不变的前提下防CLR回收。

    8、类型修饰符:只要是面向对象必然躲不开修饰符,修饰符即包括修饰成员变量和成员函数,还包括修饰继承关系。公有、私有和保护的就不说了,说说C#中几个有特点的,internal表示当前项目内部可访问,readonly表示成员变量为只读,sealed等同于C++和java中的final防继承。

    9、继承关系:除了C++以外越来越多面向对象的开发语言选择单一继承(接口允许多重继承),在继承的同时忽略继承修饰符,java用法:public class B extends A,C#用法:public class B : A,C++用法class B : public A,其中public也可以是私有和保护类型,和多重继承一样这些复杂的概念广被吐槽,这就好比臭豆腐喜欢的人甘之若饴讨厌的人避之不及。

    10、变量类型:比较喜欢强类型的开发语言,在使用变量前显式声明变量类型,许多脚本语言为了方便开发者var了事,golang也用var自动推导变量类型,但本质还是强类型。在基本数据类型中C、C++、C#和golang都提供8位16位32位64位有无符号类型变量,而java不区分符号,这样做真的好吗?

    11、拆装箱操作:面向对象的编程语言基本都提供装箱(boxing)和拆箱(unboxing)操作,有的地方称为加框操作和消框操作好有喜感的翻译,把基本数据类型封装到对应的数据对象中,从而通过调用对象方法实现对基本数据类型的操作。

    12、属性概念:不清楚在主流开发语言中这个概念算不算是C#独有的,感觉这个设计思想夹杂着浓重的视窗气息(一张视窗对象的继承关系图谱可以让人静静的看上一整年),C#对象中的属性包含对象的成员变量但不仅仅限于此,声明和用法也极有特色,属性在对象中并不占用空间,属性这个名词完美的解释了它的作用,写属性set自动隐含value参数,害的第一次接触属性概念的人满世界找value变量从哪里蹦出来的,调用的时候格式更像公有的成员变量而不是成员方法,不加括号显得光秃秃的有没有。

    13、静态修饰符:在C和C++中static全局变量表示该变量的作用域在当前文件内,在函数中表示函数返回不释放变量存储空间并保存其当前值,对于纯面向对象的开发语言中因为没有全局的概念,静态修饰符则用来将变量放在静态数据区,表示该变量在项目中的单一有效性。

    14、索引器:indexer算是C#中特有的概念吧,声明与属性类似,名称叫this并用中括号做定界符,定义完成以后就可以像操作数组一样操作对象了,真霸气!

    15、字符集:C#和java都把unicode作为默认的字符集,对于涉及中文的开发确实方便太多了,用C处理ANSI以外的编码时各种乱码确实让人头疼。

    16、数组的定义和使用:C#对数组的声明有两种方式,以二维数组为例int[][]和int[,],前者是一个n*m但m不定长的二维交错数组,后者是n*m的定长二维数组,这和其他主流开发语言不太一样,虽然各有各的变通方式,但都不如C#看上去清新靓丽。

    17、结构体:C#保留了C和C++语言中的结构体数据类型,给人多了一份亲切感,而对于一个含有n个元素的数组,存储结构体远比存储对象要经济实惠的多,尤其是C#把结构体当做值类型看待分配的是栈空间,而对象被当做引用类型看待分配的是堆空间,唯一的缺点是传参值复制开销略微大点,个人建议java可以借鉴一下下啦,嘻嘻~

    18、同步机制:无论是C#还是java都把同步机制的处理极大的简化了相比C和C++而言,在面向过程的编程实现中,同步机制都是作用于函数的,对锁的操作小心了再小心,一不留神处理不当死锁是稀疏平常的事情,面向对象的编程实现上对锁的处理最明显的变化就是加在对象上,锁的粒度和边界不像面向过程时那么费心了,更多的精力可以放在逻辑组织和算法实现上了。

    19、异常处理:程序错误有编译错误、运行错误和逻辑错误,一个工程中很大一部分的代码都是用于对运行时错误和异常进行处理,try-catch的好处是可以批量捕获异常并根据异常类型实现不同的操作,也可以throw给上层处理,还可以finally一些释放资源的操作,书写看起来美观多了,也不用担心异常终止资源占用的问题了,这方面C有点老迈需要年轻化。

    20、对象继承指代:在当前类中,C++和java用super指代父类用this指代自己,C#用base指代父类用this指代自己,C和golang只想做好自己。

    粗略大致列举了二十条吧,对比了C、C++、java和golang几种语言从设计到语法上的异同,不是想表达哪个语言好哪个语言烂,更不是为了证明某个语言开发者高大上某个语言开发者穷矮矬,不必对号入座。有人的地方就有江湖,有江湖的地方就有门派,有门派的地方就有一招一式,每个人可以表达好恶,但标准不一定是唯一的,各路江湖豪杰华山论剑切磋技艺相互学习相互汲取取长补短,其实各种编程语言的设计思想大致都是相同的,不同之处在于语法、书写和侧重解决的问题,励斌出品必是精品!

网友评论

登录后评论
0/500
评论
厉力文武
+ 关注