你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C#——兼容了值类型/引用类型

[复制链接]
gaosmile 发布时间:2020-11-23 20:17

很多游戏开发者都是由于Unity而“被迫”使用C#的。但用过一段时间,都会由衷赞叹:真香。

如果有些同学没感觉到很香,有可能是没有仔细和其它语言比较。

C#良好兼容了值类型/引用类型,在发展中逐步解决了其他高级语言没解决好的问题。

纵观主流语言,C语言在语法上是以值类型为基础,借助指针实现引用类型;而Python/Lua等语言,是以引用类型为基础。

论性能和细节控制力,C语言的设计上限更高;但是论简易程度,Python更为统一、易用。这一基本矛盾在之前的语言里都没有解决好。

而C#很好的总结了前人的经验,在基础语法上就区分了值类型和引用类型。对初次接触编程的同学来说这一点容易造成学习障碍,但是只要掌握了它,就会给实际工作带来极大便利。

反观历史,C#也曾经因为 值类型/引用类型 保守诟病,“拆箱”和“装箱”一直是个招黑的设计。但后来我们看到,随着泛型的成熟和普及,随着泛型容器代替通用容器,装箱和拆箱的问题已经在很大程度上解决了。

还有对异步的支持等等,C#的设计最初带来了一些问题,但是最终还是交上了一份满意的答卷。

充分利用栈空间,非常高效,做了一部分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代码。在局部热点可以完全解放性能。

良好的语法设计和库函数设计,引导程序员写出更快且更自然的代码。

C#中最常用的容器List,也具有一些良好的设计,当然其它语言也有类似的优点:

// 新建一个list,长度为0。但在堆中预留10万个位置 List list = new List(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, IEquatable { // .... }

熟悉C++的人,经过思考,可以很好的理解IComparable、IEquatable以及它们的泛型形式。同时也能猜出“Interface”的概念。思考C#的底层设计,给人的感觉就是自然、规范、恰到好处。

总之,C#语言及其标准库的设计,非常值得借鉴和推崇。

C#的良好设计让它在游戏开发领域走出了一条光明大道,在其它领域也有着越来越广泛的应用。有C语言基础的朋友可以快速上手C#,适合开发单片机的上位机。


收藏 评论0 发布时间:2020-11-23 20:17

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版