第壹章第3节 C#和TS语言对比-类型概述

14 阅读4分钟

类型在编程开发语言中,占据核心位置,甚至可以简单的概况为:编程开发就是在定义和使用类型。C#和TS的数据类型,可以划分为值类型和引用类型,还有原始类型、基本类型等等这些称谓,个人建议按值类型和引用类型来划分,是比较准确的。

一、值类型

  1. 只需要一段内存,存储实际数据
  2. 存储在栈中,效率更高
  3. 根据不同的值类型,分配不同的内存大小
  4. 值类型一般包括数值、布尔、字符
  5. JS/TS的值类型:number、boolean、string、symbol、bigint
  6. UTS中的值类型:number、boolean、string,以及专有平台的值类型
  7. C#中的值类型:数值(byte/int/float/double等)、布尔bool、字符char、枚举、结构体

二、引用类型

  1. 需要两段内存,一段在堆中,存储实际数据,一段在栈中,存储内存地址,这个地址指向数据在堆中存放的位置,称之为引用
  2. 引用类型存放在堆中的实际数据,也有值类型和引用类型。其中,引用类型也是两段内存方式,但引用和实际数据都在堆里。
  3. JS/TS/UTS中的string是值类型。但是,C#中的string是引用类型,是由char组成的数组,且其具有值类型的特征,比如不可变性。所以在C#中,也把string划归到基本类型。
  4. JS和C#都是垃圾回收语言,垃圾回收机制不定时检查没有引用的数据并自动清理,这也是垃圾回收语言性能比C这类非垃圾回收语言稍低的原因,但由系统自动管理引用,会更加安全。
  5. JS/TS中的引用类型:字面量对象、数组、类、内置对象、第三方库定义的对象
  6. UTS中的引用类型:字面量对象、数组、类、内置对象、第三方库定义的对象,UTS如果编译到安卓和iOS平台,type会被编译为class,所以它也是引用类型。
  7. C#中的引用类型:匿名对象、数组、类、接口、委托、内置对象、第三方库定义的对象
  8. ***JS/TS/UTS接口:JS没有接口;TS中的接口只存在于开发时,编译后不存在;UTS不清楚是否和TS一致
  9. ***JS/TS/UTS枚举:JS没有枚举;TS中枚举被编译为变量和函数;UTS不清楚是否和TS一致
  10. 最后画图说明一下引用类型数据的最大特征:

三、特殊类型

  1. null:
  • 在TS/UTS中,typeof的结果object,它是原型链的终点。JS中可以赋值给任何类型,但TS(严格模式)/UTS中只能赋值给引用类型或可空值类型
  • C#中null只能赋值给引用类型或可空值类型,typeof会报错,说明它不是一种具体类型,只是一个特殊的值
  1. any/dynamic:
  • TS/UTS中的any指运行时类型,运行时才确定类型。看了下HarmonyOS Next P2,好像any都禁用了
  • C#中的dynamic作用一样,也是运行时类型,但它还有自身的检查规则,更安全些
  1. undefined:
  • UTS中没有undefined,在JS或TS中也应该避免使用
  • C#没有undefined
  1. 函数:
  • JS/TS/UTS中的函数:typeof类型是function,是一种引用类型,但定义时,堆中只存放了代码片断,并没有为参数和方法体中的变量分配内存空间,只有在调用方法时,才分配内存空间给参数和变量,并在执行完方法后立即释放。方法可以直接作为参数和返回值传递。
  • C#中的函数:typeof类型,返回方法的元数据,方法并不是一种独立的类型。在定义时,将代码片断存放到元数据中,并没有为参数和方法体中的变量分配内存空间,只有在调用方法时,才分配内存空间给参数和变量,并在执行完方法后立即释放。如果要将方法作为参数和返回值传递,则需要借助委托。
  1. object:在JS/TS/UTS和C#中,object都是所有类型的基类,所有值都可以赋值给object类型的变量

四、下面这些内置对象应该熟悉掌握

  1. 基本类型对象(数值、字符串和布尔)
  2. 数组对象
  3. 集合对象
  4. 日期时间对象
  5. 数学对象
  6. 正则对象
  7. JSON对象
  8. 异步操作对象
  9. 文件操作对象
  10. 异常对象