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语言
    +关注

    关注

    180

    文章

    7608

    浏览量

    137150
  • C++
    C++
    +关注

    关注

    22

    文章

    2112

    浏览量

    73717
  • python
    +关注

    关注

    56

    文章

    4800

    浏览量

    84820

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    不同类型adc的优缺点分析

    ADC) 优点 高精度 :SAR ADC通常提供较高的分辨率,适合需要高精度测量的应用。 低功耗 :与某些其他类型的ADC相比,SAR ADC在低至中等采样率下功耗较低。 成本效益 :对于许多应用来说,SAR ADC提供良好
    的头像 发表于 11-19 16:58 980次阅读

    如何使用C++20比较不同类型的整型

    std::numeric_limits::max(),将产生 UB。 倘若你使用了类型推导,问题会更加明显。
    的头像 发表于 11-11 09:35 175次阅读

    如何使用C++20比较不同类型的整型

    std::numeric_limits::max(),将产生 UB。 倘若你使用了类型推导,问题会更加明显。
    的头像 发表于 11-11 09:35 167次阅读

    鸿蒙原生应用元服务开发-仓颉基础数据类型元组类型

    二元,例如,(Int64, Float64) 表示一个二元组类型,(Int64, Float64, String) 表示一个三元组类型。 元组的长度是固定的,即一旦定义一个元组类型
    发表于 09-12 11:02

    鸿蒙原生应用元服务开发-仓颉基础数据类型浮点类型

    区间类型用于表示拥有固定步长的序列,区间类型是一个泛型,使用Range 表示。当 T 被实例化不同的类型时(要求此类型必须支持关系操作符,并且可以和 Int64
    发表于 09-11 11:08

    鸿蒙原生应用元服务开发-仓颉基础数据类型Unit与Nothing类型

    一、Unit 类型 对于那些只关心副作用而不关心的表达式,它们的类型是Unit。例如,print 函数、赋值表达式、复合赋值表达式、自增和自减表达式、循环表达式,它们的类型都是 Un
    发表于 09-06 15:43

    技术干货驿站 ▏深入理解C语言:基本数据类型和变量

    C语言中,数据类型和变量是编程的基础,也是理解更复杂概念的关键。数据类型决定变量的内存分配、存储范围和操作方式,而变量则是存储数据的容器。本篇文章将从基本数据
    的头像 发表于 07-26 17:53 2192次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b>语言:基本数据<b class='flag-5'>类型</b>和变量

    树形控件为什么有一种是数组类型

    各位大神好!我在使用树形控件过程中,发现有树形控件由字符串类型变成了数组类型,两个类型都可以使用树型控件的属性和调用节点,但两个类型引用
    发表于 07-24 17:57

    STM32L0如何能做到一版软件,兼容不同APN类型的SIM卡?

    问题介绍:使用的NB模组支持全网通,但是客户使用会有两种类型卡,即移动普通物联网,apn“cmiot”和移动NB物联网卡,apn“cmnbiot”。单片机软件,只能每次写一个APN去拨号注网,不同的APN每次分不同的软件维护起来太麻烦。 求助:如何能做到一版软件,兼容不同
    发表于 04-25 06:36

    鸿蒙TypeScript开发入门学习第3天:【TS基础类型

    任意是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
    的头像 发表于 03-28 15:02 558次阅读
    鸿蒙TypeScript开发入门学习第3天:【TS基础<b class='flag-5'>类型</b>】

    C语言数据类型有哪些

    C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定变量存储占用的空间,以及如何解释存储的位模式。
    发表于 03-20 10:56 488次阅读
    <b class='flag-5'>C</b>语言数据<b class='flag-5'>类型</b>有哪些

    char是有符号类型还是无符号类型

    看一个C语言的笔试题,题目很简单,问char是有符号类型还是无符号类型
    的头像 发表于 03-17 10:15 1279次阅读

    C语言如何掌握强制类型转换的精髓

    强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型到一个简单的整型中,您需要把 long
    的头像 发表于 02-26 11:00 535次阅读
    <b class='flag-5'>C</b>语言如何掌握强制<b class='flag-5'>类型</b>转换的精髓

    arcgis类型与字段类型兼容

    ArcGIS是一个地理信息系统软件,可以用来处理、分析和可视化地理数据。在ArcGIS中,类型和字段类型之间需要相互匹配,否则会导致不兼容的错误。 在ArcGIS中,
    的头像 发表于 02-25 11:14 1764次阅读