作为嵌入式开发者,已经熟悉了C语言跟VS。推荐你也了解下C#,用来开发上位机挺舒服。如果你仔细与其它语言比较,就会感觉到很香。
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《int》 list = new List《int》(100000);// 加入很多元素,由于容量足够没有GCfor (int i=0; i《89000; i++) {list.Add(i); }// 用过以后清空list,长度变成0list.Clear();// 但容量还是10万,继续增加元素还是没有GCfor (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#,适合开发单片机的上位机。
编辑:jq
-
嵌入式
+关注
关注
5082文章
19111浏览量
304863 -
C语言
+关注
关注
180文章
7604浏览量
136713 -
代码
+关注
关注
30文章
4780浏览量
68539
原文标题:用C#开发上位机挺舒服,文末送资料
文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论