答过类似的问题。
很多游戏开发者都是由于Unity而“被迫”使用C#的。但用过一段时间,就会由衷赞叹:真香。
如果有些同学没感觉到很香,有可能是没有仔细和其它语言比较 :)
所谓的“流行语言TOP10”有好几种,但无论参考TIOBE还是Github,流行语言的前五位的竞争者,基本都是Java,Python,C,C++,C#,Visual Basic, JavaScript。不同的榜单排名有差异,但你总能在前几位看到它们。而且从十年前开始,C#的地位一直在稳步上升。
由于阿里云计算以及相关技术栈的流行,在国内Java是当之无愧的老大。但由于游戏领域大量使用Unity和C#,所以如果汇总国内招聘网站的关键词,C#出镜率依然能排进前5(前五位:Java,C++,C#,JavaScript,Python)。参考链接:2019年10月中国编程语言排行榜_毛毛虫-CSDN博客
可以预见,随着技术栈的迭代,C#的地位会越来越稳固。但除非有颠覆式的变革,在通用开发领域Java依然占领导地位。
说完了C#整体的情况,下面说的都是C#在语言设计上的一些亮点。
纵观主流语言,C语言在语法上是以值类型为基础,借助指针实现引用类型;而Python/Lua等语言,是以引用类型为基础。
论性能和细节控制力,C语言的设计上限更高;但是论简易程度,Python更为统一、易用。这一基本矛盾在之前的语言里都没有解决好。
而C#很好的总结了前人的经验,在基础语法上就区分了值类型和引用类型。对初次接触编程的同学来说这一点容易造成学习障碍,但是只要掌握了它,就会给实际工作带来极大便利。
反观历史,C#也曾经因为 值类型/引用类型 保守诟病,“拆箱”和“装箱”一直是个招黑的设计。但后来我们看到,随着泛型的成熟、随着泛型容器代替object容器,装箱和拆箱的问题已经在很大程度上解决了。
还有对异步的支持等等,C#的设计最初带来了一些问题,但现在的C#已经加入了基于多线程的异步语法,比如async和await等,基本让人满意。
值类型有一大特点,就是能充分利用栈空间。高级语言的GC特性一直饱受诟病,但下面的Unity常见代码,运行时没有GC:
// 通过输入的三维向量,移动物体的位置 void Move(Vector3 input) { // 演示代码,有意分成很多行 input = input.normalized; Vector3 move = input * 2.0f; move *= Time.deltaTime. transform.position += move; }
这段代码没有在堆上分配空间,你所看到的操作全都是在栈上进行的,GC压力为0。我认为这是C#最令人惊艳的一点。
一般来说数组长度较长,默认分配在堆上。但是C#也提供了便利的语法,在栈上分配数组,对项目后期优化来说简直是神技:
public void unsafe foo() { int* bar = stackalloc int [10]; }
没错,C#依然保留了指针,但一般仅用于局部的unsafe代码。在局部热点可以完全解放性能。
C#中最常用的容器List,也具有一些良好的设计(当然其它语言也有类似的优点)
// 新建一个list,长度为0。但在堆中预留10万个位置 List<int> list = new List<int>(100000); // 加入很多元素,由于容量足够没有GC for (int i=0; i<89000; i++) { list.Add(i); } // 用过以后清空list,长度变成0 list.Clear(); // 但容量还是10万,继续增加元素还是没有GC for (int i = 0; i < 99000; i++) { list.Add(i); }
list在预留空间充足时,添加元素不会产生GC。而且List和值类型结合使用,在内存占用上也有优势。当然,很多其它语言也有类似的设计,可以说别的语言做的好的部分,C#做的也一样好。
最初接触C#的时候,看看int的原型,收获很大:
public struct Int32 : IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32> { // .... }
熟悉C++的人,经过思考,可以很好的理解IComparable、IEquatable以及它们的泛型形式。同时也能猜出“Interface”的概念。思考C#的底层设计,给人的感觉就是自然、规范、恰到好处。(C#泛型与接口的设计不错,可以说是踩着C++的肩膀做到的。)
C#的良好设计让它在游戏开发领域走出了一条光明大道,在其它领域也有着越来越广泛的应用。
C#出现较晚,算是当今所有语言的集大成者。现在它的发展主要受市场环境制约。也许几年以后,会有新的语言在它的基础上更上一层楼 :)