枚举

适用场景

只要变量取值是固定、有限、不会随便新增的选项,一律用枚举。

✅ 必用枚举的情况:

  1. 状态类:订单状态、用户状态、请假状态、设备状态
  2. 类型类:性别、学历、角色权限、商品类型
  3. 方向 / 选项:上下左右、星期、月份、开关模式

❌ 别用枚举:

  • 经常要新增选项、数据会动态变化
  • 需要存多个字段信息(只能存单个数字常量)

核心概念

枚举是值类型,用于声明一组有限、固定的命名常量。

调用

枚举:直接用 枚举名。常量 调用,不用 new

枚举本身就是一堆提前定义好的固定常量

enum Gender { Male, Female }

// 直接调用,不用 new
Gender g = Gender.Male;

本质:枚举是静态常量集合,天生就存在,不需要实例化。

基础语法

// 定义枚举:enum + 枚举名 + 常量列表
enum 枚举名
{
    常量1,
    常量2,
    常量3
}

案例

using System;

// 1. 定义枚举:订单状态
enum OrderStatus
{
    Pending,   // 待支付(默认值=0)
    Paid,      // 已支付(默认值=1)
    Shipped,   // 已发货(默认值=2)
    Completed  // 已完成(默认值=3)
}

class Program
{
    static void Main()
    {
        // 2. 使用枚举
        OrderStatus status = OrderStatus.Paid;

        // 3. 常用操作
        Console.WriteLine(status);               // 输出:Paid(枚举名称)
        Console.WriteLine((int)status);          // 输出:1(枚举对应的数值)
        Console.WriteLine(status.ToString());    // 输出:Paid(转字符串)
    }
}

结构体 (Struct)

核心特点

值类型、栈存储、体积小、单纯存数据、没有复杂业务逻辑、不需要继承

✅ 必用结构体的情况:

  1. 小数据载体:坐标 Point、矩形 Rectangle、颜色、尺寸
  2. 只存几个数字 / 字符串,不做复杂方法、不用继承
  3. 频繁创建、销毁,追求性能、不想堆内存 GC 压力
  4. 做数据分装,赋值要独立副本(改一个不影响另一个)

❌ 别用结构体:

  • 字段很多、体积很大
  • 需要继承、多态
  • 有复杂业务逻辑、大量方法
  • 想做引用共享(改一处全变)

核心概念

结构体是值类型,用于封装轻量级、无复杂逻辑的一组数据。适合:坐标、点、尺寸、简单参数;不适合:需要继承、有复杂方法、大数据量的场景(用类)。

调用

结构体:值类型,可以 new 也可以不 new

结构体是值类型,数据直接存在栈内存里。所以有两种写法都合法:

struct Student
{
    public int Id;
}

// 写法一:使用new
Student s1 = new Student();

// 写法二:不使用new,直接声明
Student s2;
s2.Id = 10;

本质:结构体变量声明时,内存就已经自动分配好了,可省略 new

类 (class)

✅ 什么时候用类(class)?

满足下面任意一条,就用类:

  1. 它是一个 “完整的事物 / 对象”,不只是纯数据

    • 比如:用户、学生、订单、游戏角色、购物车、员工
    • 这类东西除了数据,通常还有自己的行为(方法)
  2. 需要封装数据 + 写方法 / 逻辑

    • 比如:Student 除了 IdName,还要有 Study()GetScore() 方法
    • 结构体不能写复杂逻辑,类可以写完整的业务逻辑
  3. 需要继承、多态、接口这些面向对象特性

    • 比如:Animal 是父类,CatDog 继承它
    • 结构体不能被继承,类可以
  4. 数据量比较大,或者会被大量传递、共享

    • 类是引用类型,传递的是引用,不会复制整个对象,效率更高
    • 结构体是值类型,传递时会复制一份完整数据,大数据会有性能损耗
  5. 需要表示 “可变的、会变化的状态”

    • 比如:用户的余额、订单的状态、玩家的血量,这些会在程序运行中持续变化
    • 类的引用特性很适合这种场景

❌ 什么时候不用类?(优先考虑结构体 / 其他方式)

满足下面任意一条,就别用类:

  1. 它只是一组 “纯数据”,没有任何行为 / 方法

    • 比如:坐标 (x, y)、颜色 (r, g, b)、年龄 + 身高 + 体重这种小数据组合
    • 用结构体更轻量,也更贴合 “数据容器” 的定位

调用

类 (class):引用类型,必须 new 才能调用成员

类是引用类型,声明变量只是开辟了一个内存地址的空盒子,里面没有实际对象。

必须用 new 在堆上创建实例,才能使用成员。

语法

class Person
{
    public int Age;
    public string Name;
}

// 1. 声明变量(只是个地址标签,还没指向任何对象)
Person p;

// 报错:p 是空引用,不能调用成员
// p.Age = 18;
// p.Name = "张三";

// 2. 用 new 创建对象,让 p2 指向堆上的真实实例
Person p2 = new Person();

// 3. 现在可以正常调用、赋值、读取成员
p2.Age = 18;          // 给 Age 赋值
p2.Name = "张三";     // 给 Name 赋值

Console.WriteLine(p2.Age);  // 读取 Age,输出 18
Console.WriteLine(p2.Name); // 读取 Name,输出 张三

更多推荐