0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C#良好兼容了值类型/引用类型

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2020-11-20 10:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

很多游戏开发者都是由于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#,适合开发单片机上位机

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144611
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76712
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89583

原文标题:用过C#的都说香,也送你一份秘籍

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言自动类型转换

    一、自动类型转换 数据类型存在自动转换的情况. 自动转换发生在不同数据类型运算时,在编译的时候自动完成。 char类型数据转换为int类型
    发表于 11-25 08:04

    C语言强制类型转换

    强制类型转换是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表示的类型
    发表于 11-24 06:32

    发布元服务配置应用内资费类型和应用内商品

    一、设置应用内资费类型,用于标识用户使用元服务时需要付费的类型。基于业务场景,支持选择多个类型。 应用内资费类型包括: 激活收费 道具收费 关卡收费 购买虚拟币 部分章节收费(图书阅读
    发表于 11-19 10:18

    如何从电容去区分电容的类型及使用范围

    ,你几乎可以立刻缩小电容类型的选择范围。电容VS电容类型& 应用范围速查表 下表清晰地展示不同容量范围所对应的主流电容类型及其典
    发表于 11-13 15:20

    ATE自动测试系统能兼容哪些类型的电源测试?

    在当今电子设备无处不在的时代,电源的质量和可靠性直接影响着终端产品的性能与寿命。而确保电源质量的关键工具——ATE自动测试系统,已成为电源设计和制造过程中不可或缺的一环。本文将和大家介绍一下源仪电子的ATE测试系统能够兼容的电源测试类型,帮助您了解这一高效、精确的测试解决
    的头像 发表于 10-29 14:42 449次阅读
    ATE自动测试系统能<b class='flag-5'>兼容</b>哪些<b class='flag-5'>类型</b>的电源测试?

    单模光纤线有几种类型

    ,1550nm处损耗最低(约0.2dB/km),分为A/B/C/D四类,其中D类性能最优。 典型应用:城域网、接入网、短距离传输(≤40km),成本敏感型项目。 优势:兼容性好,成本低,是应用最广泛的光纤类型。 G.653(色散
    的头像 发表于 09-11 10:00 1122次阅读

    工业相机的类型及不同类型的应用

    工业相机根据不同的分类标准,可分为多种类型,每种类型都有其独特的应用场景。
    的头像 发表于 08-29 17:07 563次阅读
    工业相机的<b class='flag-5'>类型</b>及不同<b class='flag-5'>类型</b>的应用

    SQL 通用数据类型

    data type. SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识
    的头像 发表于 08-18 09:46 576次阅读

    【原创】labview 通过“引用调用“ 的快捷用法,不需编程获取VI引用

    labview的“通过引用调用”函数在调用严格类型VI时,通常需要获取VI的引用。该函数的输入端也确实有引用接口,如图: 但是该函数还有一个快捷用法,右键单击
    发表于 07-30 17:53

    可以在哪里修改以更改非 PD 类型 C 中不同的 Rp 等级?

    到 ccg3pa 时更改 rp 的方法 在那个 non_pd_type_C 文件中,我首先设置那个 Rp 等级,然后在设置为 C 类型之后将其设置为非 PD
    发表于 05-27 07:16

    光刻胶的类型及特性

    光刻胶类型及特性光刻胶(Photoresist),又称光致抗蚀剂,是芯片制造中光刻工艺的核心材料。其性能直接影响芯片制造的精度、效率和可靠性。本文介绍光刻胶类型和光刻胶特性。
    的头像 发表于 04-29 13:59 6924次阅读
    光刻胶的<b class='flag-5'>类型</b>及特性

    玩转C#/LABVIEW,斯撩

    **labview软件开发 C#软件开发 C#自定义控件Labview调用 labview和C#组合开发** 斯撩,斯撩
    发表于 04-02 22:44

    AWG电缆的常见材料类型

    美国线规(AWG)是一种用于指定电线直径的标准化系统,它在美国广泛使用。AWG系统基于电线的直径,数字越小,电线越粗。电线的材料类型对于其性能、成本和应用至关重要。以下是一些AWG电缆的常见材料类型
    的头像 发表于 01-13 17:19 1705次阅读

    C#基于Halcon实现Basler相机采图

    C#基于Halcon实现Basler相机采图
    发表于 01-05 09:16 0次下载

    总线接口的类型与选择指南

    类型:异步、全双工串口总线。 特性:有两根线,一根TXD用于发送,一根RXD用于接收。不需要时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。 I2C总线 类型:同步、半双工双向的两线式串口总线。 特性:由串
    的头像 发表于 12-31 10:06 2244次阅读