去年.net5出来后,我在.net前世今生里问了一个问题,就是能不能用C#做全栈开发,带着这个问题去观察和理解.net,得到了完全肯定的答案,以后用C#就可以一张蓝图绘到底了。
1. 性能提升
.Net Core3.1 .Net 5 .Net 6(2021年11月)每个版本都非常重视性能优化。众所周知,C#是托管语言,相比于C和C++,托管代码与内存之间有一个垃圾回收机制,这降低了内存访问速度(换来了安全性)。为提高内存访问速度,C#引入了Span<T>这个接近指针的新类型,可以自由的对数组进行切片而不用复制,引入了ArrayPool减少内存的分配,正确使用这些(System.Buffers, System.Memory)新类型,你将获得媲美指针的内存访问速度,许多.Net底层库都提供了以Span类型为(唯一)参数的API。
另一方面,多线程模型对于服务器开发非常重要,但线程粒度大(一个线程需要1M内存),线程的调度(切换上下文)也需要耗费CPU时间片,相比较,go语言的goroutine就轻量得多,go在服务端吞吐性能上也遥遥领先。.Net 的应对是推TAP,用Task+异步来实现高性能的并发,追平了与go的性能差距。
在服务器编程、游戏编程领域,今天的C#性能已经没有瓶颈了,微软自己的许多库C代码也在用C#重写,以避免维护(C/C++ 和 C#)两套代码。
2. 走向台前
如果说服务器开发是幕后,那么前端(网页、APP、桌面应用)的开发就是台前了。这块一直是javascipt/typescript的天下,比较流行的框架有React, Angular, Vue, ASP.NET Core Razor 属于服务器端渲染,只是用了web socket提高通讯效率。
自从有了 Blazor webassembly,情况发生了变化。web assembly让浏览器可以运行任何语言的代码而不仅仅是javascript,这就让C#有了走向前端的机会,Blazor正是C#取代javascript做富交互的。Blazor webassembly完全在浏览器中执行,许多.Net库都可以应用,也可以跟js互操作,已经有像Ant Design Blazor这样的前端库了,DevExpress Syncfusion这些老牌商用你 .Net 库也都跟进了。
3. gRPC
以往,我们用C#写服务器端往往要写3遍实体,首先是应用层实体A,然后是网站后台的实体B,最后是前端js里的实体C,他们差别不大,主要是序列化方式不同:A-B之间一般是WCF或.net remoting,B-C之间一般是Web API,这无形中增加了代码量。nodejs之所以走向服务端,也是为了少一次实体定义。那么,前端和服务器之间能不能只用一套实体?gRPC+Blazor webassembly 似乎可行。
.Net Core3.0开始,微软把gRPC作为首选,看重的是其语言无关、高性能等优势,在.Net 5里gRPC开发已经相当方便,主要工作就是写proto文件了。前端和服务器用gRPC通讯后,二进制的protobuf比json小一半,(有链接)http/2也比http协议效率高,真可谓事半功倍。
4. Visual Studio
最近vs2019在一个月内更新了4次,宇宙无敌ide加上C#各种语法糖,C#开发效率无疑要高出其他语言一大块。市面上,C#码农价码不如java,其中一个原因就是java10个人干的活C#只要3个人,导致C#的人员需求量小。
总结
结合.Net 发展战略和.Net5现状,我相信C#开发者的春天来了,C#作为一种前后端通吃的语言,在兵器谱的排行榜上地位将快速上升,预祝唐家霸王枪重夺兵器谱第一名! 2021年4月8日。