第壹章第9节 C#和TS语言对比-枚举

C#中,枚举本质上是命名的整数值常量,其值必须是整数型,数据结构上是值类型。而TS中的枚举编译后实际上是一个对象,通过立即执行函数来实现,它的值即可以是整数,也可以是字符串,比较多骚操作。

一、C#中的枚举

//1、定义枚举=============================================================
//枚举成员的可访问性,与枚举类型相同
enum Color {
  Red,     // 0,实际的值,默认从0开始
  Green,   // 1
  Blue     // 2
  //public Blue //报错,不能有修饰符
}


//2、枚举的调用==========================================================
Color c1 = Color.Red; //(int)c1 结果为0
Color c2 = Color.Green; //(int)c2 结果为1
Color c3 = Color.Blue; //(int)c3 结果为2


//3、改变枚举的底层类型
//默认的底层类型是int,可以修改为其它整数类型
enum Colr:ulong{}


//4、枚举成员的值=========================================================
//如上例,如果没有给成员赋值,则值从0递增----------

//可以显式赋值
enum Color{
  Red = 1,
  Green = 3,
  Blue = 5
}

//只赋值一个,后面递增
enum Color{
  Red = 10,
  Green, //11
  Blue //12
}
enum Color {
  Red, // 0
  Green = 7,
  Blue // 8
}

//成员名不能重复,但值可以重复
enum Color{
  Red = 1,
  Green = 1, 
  Blue = 1
}


//4、同类型枚举可以比较===================================================
enum Frist{Mem1,Mem2}
enum Second{Mem1,Mem2}
if(Frist.Mem1 < First.Mem2){} //可以比较
//if(Frist.Mem1 < Second.Mem2){} //报错,不同枚举类型不能相互比较


//5、获取成员名==========================================================
enum Color {
  Red, 
  Green,
  Blue
}
Enum.GetName(typeof(Color),1) //Green
foreach(var name in Enum.GetNames(typeof(Color)))
{
  ... //Red Green Blue
}

二、TS/UTS中的枚举

//1、定义枚举=============================================================
enum Color {
  Red,     // 0,实际的值,默认从0开始
  Green,   // 1
  Blue     // 2
}
//在TS中,enum会被编译为对象,使用立即函数实现
let Color = {
  Red: 0,
  Green: 1,
  Blue: 2
};
//所以,它的作用,实际上可以被as const替代
const Bar = {
  A: 0,
  B: 1,
  C: 2,
} as const;
if (x === Foo.A{}
// 等同于
if (x === Bar.A) {}
//所以,不能定义同名的枚举和常量
enum Color {
  Red,
  Green,
  Blue
}
//const Color = 'red'; // 报错


//2、枚举调用=============================================================
let c = Color.Green; // 1,自动推断类型
// 等同于
let c = Color['Green']; // 1
//标注类型
let c:Color = Color.Green;  //1
//反向映射,通过值获取成员名
Color[1] //Color.Green


//TS中的枚举是只读的,不能重新赋值
//Color.Green = 8;//报错


//3、枚举成员的值=========================================================
//如上例,如果没有给成员赋值,则值从0递增----------

//可以显式赋值
enum Color{
  Red = 1,
  Green = 3,
  Blue = 5
}

//只赋值一个,后面递增
enum Color{
  Red = 10,
  Green, //11
  Blue //12
}
enum Color {
  Red, // 0
  Green = 7,
  Blue // 8
}

//除了数值,还可以是字符串
enum Direction {
  Up = 'UP',
  Down = 'DOWN',
  Left = 'LEFT',
  Right = 'RIGHT',
}
enum Enum {
  One = 'One',
  Two = 'Two',
  Three = 3,
  Four = 4,
}


//4、获取所有成员值或成员名===============================================
enum MyEnum {
  A = 'a',
  B = 'b'
}
type Foo = keyof typeof MyEnum; // 'A'|'B' //成员名

enum MyEnum {
  A = 'a',
  B = 'b'
}
type Foo = { [key in MyEnum]: any }; // { a:any, b: any }


//5、使用枚举的一个案例==================================================
enum Operator {
  ADD,
  DIV,
  MUL,
  SUB
}
function compute(
  op:Operator,
  a:number,
  b:number
) {
  switch (op) {
    case Operator.ADD:
      return a + b;
    case Operator.DIV:
      return a / b;
    case Operator.MUL:
      return a * b;
    case Operator.SUB:
      return a - b;
    default:
      throw new Error('wrong operator');
  }
}
compute(Operator.ADD, 1, 3) // 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值