C# 有什么冷艳到你的处所?

6小时前 (12:33:12)阅读1回复0
zaibaike
zaibaike
  • 管理员
  • 注册排名1
  • 经验值139920
  • 级别管理员
  • 主题27984
  • 回复0
楼主

良多游戏开发者都是因为Unity而“被迫”利用C#的。但用过一段时间,就会由衷赞赏:实香。

若是有些同窗没觉得到很香,有可能是没有认真和其它语言比力 :)

1、C#优良兼容了值类型/引用类型,在开展中逐渐处理了其他高级语言没处理好的问题

纵不雅支流语言,C语言在语法上是以值类型为根底,借助指针实现引用类型;而Python/Lua等语言,是以引用类型为根底。

论性能和细节控造力,C语言的设想上限更高;但是论简易水平,Python更为同一、易用。那一根本矛盾在之前的语言里都没有处理好。

而C#很好的总结了前人的经历,在根底语法上就区分了值类型和引用类型。对初度接触编程的同窗来说那一点容易形成进修障碍,但是只要掌握了它,就会给现实工做带来极大便当。

反不雅汗青,C#也曾经因为 值类型/引用类型 守旧诟病,“拆箱”和“拆箱”不断是个招黑的设想。但后来我们看到,跟着泛型的成熟和普及,跟着泛型容器取代通用容器,拆箱和拆箱的问题已经在很大水平上处理了。

还有对异步的撑持等等,C#的设想最后带来了一些问题,但是最末仍是交上了一份满意的答卷。

2、充实操纵栈空间,十分高效,做了一部门C/C++擅长的事

值类型有一大特点,就是能充实操纵栈空间。高级语言的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代码。在部分热点能够完全解放性能。

3、优良的语法设想和库函数设想,引导法式员写出更快且更天然的代码

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#做的也一样好。

4、继承、泛型、接口、类型约束等等高级特征,都有着优良且自洽的设想

最后接触C#的时候,看看int的原型,收成很大:

public struct Int32 : IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32> { // .... }

熟悉C++的人,颠末思虑,能够很好的理解IComparable、IEquatable以及它们的泛型形式。同时也能猜出“Interface”的概念。思虑C#的底层设想,给人的觉得就是天然、标准、恰如其分。

总之,C#语言及其尺度库的设想,十分值得借鉴和推崇。

C#的优良设想让它在游戏开发范畴走出了一条光亮大道,在其它范畴也有着越来越普遍的应用。

C#呈现较晚,算是当今所有语言的集大成者。如今它的开展次要受市场情况造约。也许几年以后,会有新的语言在它的根底上更上一层楼 :)

0
回帖

C# 有什么冷艳到你的处所? 期待您的回复!

取消