许多游戏开发者都是由于Unity而“被逼”运用C#的。但用过一段时间,就会由衷赞叹:真香。假如有些同学没感觉到很香,有可能是没有仔细和其它言语比较:)1、C#杰出兼容了值类型/引证型,在开展中逐渐处理了其他高档言语没处理好的问题纵观干流言语,C言语在语法上是以值类型为根底,凭借指针完成引证类型;而Python/Lua等言语,是以引证类型为根底。论功能和细节控力,C言语的规划上限更高;但是论简易程度,Python更为统一、易用。这一基本矛盾在之前的言语里都没有处理好。而C#很好的总结了前人的经历,在根底语法上就区分了值类型和引证类型。对初次触摸编程的同学来说这一点容易形成学习障碍,但是只需掌握了它,就会给实际工作带来极大便利。
<imgsrc="https://pic4.zhimg.com/50/v2-b6d3b7878fc11edb6b0c8aec4db934fd_hd.jpg"
data-caption=""data-size="normal"data-rawwidth="619"data-rawheight="255"data-default-watermark-src="https://pic2.zhimg.com/50/v2-91e7142d6792409bd3c2a50ebcf5b1a1_hd.jpg"
class="origin_imagezh-lightbox-thumb"width="619"data-original="https://pic4.zhimg.com/v2-b6d3b7878fc11edb6b0c8aec4db934fd_r.jpg"/>
反观历史,C#也曾经因为值类型/引证类型保守诟病,“拆箱”和“装箱”一直是个招黑的规划。但后来咱们看到,跟着泛型的老练和普及,跟着泛型容器替代通用容器,装箱和拆箱的问题已经在很大程度上处理了。还有对异步的支持等等,C#的规划最初带来了一些问题,但是最终仍是交上了一份满足的答卷。2、充分利用栈空间,十分高效,做了一部分C/C++擅长的事值类型有一大特点,便是能充分利用栈空间。高档言语的GC特性一直饱受诟病,但下面的Unity常见代码,运行时没有GC://通过输入的三维向量,移动物体的方位。
voidMove(Vector3input)
{
//演示代码,有意分成许多行
input=input.normalized;
Vector3move=input*2.0f;
move*=Time.deltaTime.
transform.position+=move;
}这段代码没有在堆上分配空间,你所看到的操作全都是在栈上进行的,GC压力为0。我以为这是C#最令人惊艳的一点。一般来说数组长度较长,默认分配在堆上。但是C#也供给了便利的语法,在栈上分配数组,对项目后期优化来说简直是神技:publicvoidunsafefoo()
{
int*bar=stackallocint[10];}没错,C#依然保留了指针,但一般仅用于部分的unsafe代码。在部分热点可以完全解放功能。3、杰出的语法规划和库函数规划,引导程序员写出更快且更天然的代码C#中最常用的容器List,也具有
一些杰出的规划(当然其它言语也有相似的长处)
//新建一个list,长度为0。但在堆中预留10万个方位
List<int>list=newList<int>(100000);
//加入许多元素,由于容量足够没有GC
for(inti=0;i<89000;i++)
{
list.Add(i);
}
//用过以后清空list,长度变成0
list.Clear();
//但容量仍是10万,持续增加元素仍是没有GC
for(inti=0;i<99000;i++)
{
list.Add(i);
}list在预留空间充足时,增加元素不会产生GC。并且List和值类型结合运用,在内存占用上也有优势。当然,许多其它言语也有相似的规划,可以说别的言语做的好的部分,C#做的也相同好。4、继承、泛型、接口、类型约束等等高档特性,都有着杰出且自洽的规划最初触摸C#的时分,看看int的原型,收成很大:
publicstructInt32:IFormattable,IConvertible,
IComparable,IComparable<Int32>,IEquatable<Int32>
{
//....
}
熟悉C++的人,通过思考,可以很好的了解IComparable、IEquatable以及它们的泛型形式。一起也能猜出“Interface”的概念。思考C#的底层规划,给人的感觉便是天然、规范、恰到好处。总之,C#言语及其规范库的规划,十分值得学习和推重。C#的杰出规划让它在游戏开发范畴走出了一条光明大道,在其它范畴也有着越来越广泛的应用。C#呈现较晚,算是当今一切言语的集大成者。现在它的开展首要受市场环境限制。或许几年以后,会有新的言语在它的根底上更上一层楼:)
相关文章
- 01-05什么是CMA,具备CMA资质的软件第三方检测机构有哪些?
- 01-05什么是JSTL标签?常用的标签库有哪些?
- 01-05什么是JSTL标签?常用的标签库有哪些?
- 01-05SPRING事务的属性有哪些?其中,事务隔离级别有哪几种?什么情况需要使用这几种事务隔离级别?
- 01-05新手最纠结的事。学什么语言最好?学什么语言有前途(or 钱途)?
- 01-0510万+的标题怎么取?YouTube标题首词与播放量有什么关系?
- 01-05NAC公链主打应用而生的NA(Nirvana)公链有什么过人之处?
- 01-05AOP与OOP有什么区别,谈谈AOP的原理是什么
- 01-05Python中的arange是什么?和range有什么不同?
- 01-05RESTful API设计的未来对开发人员有什么影响