C#常量(const)与枚举(enum)使用指南

一、 常量 (const)

常量,就是一个其值在程序编译时就已经确定,并且在整个运行期间都不能被修改的量。

如何声明常量?

使用 const 关键字进行声明,并且必须在声明时就进行初始化。

csharp 复制代码
const double PI = 3.14159;
const int DAYS_IN_WEEK = 7;
const string AppVersion = "1.0.2";

命名约定:常量的名称通常使用全大写字母,并用下划线分隔单词,以示区别。

const vs readonly

你可能还会遇到 readonly (只读) 关键字,它与 const 类似但有一个关键区别:

  • const 的值必须在编译时确定。
  • readonly 的值可以在运行时确定(在构造函数中赋值),但一旦赋值后就不能再更改。
csharp 复制代码
public class Config
{
    // 编译时常量
    public const int DefaultTimeout = 5000; 

    // 运行时只读字段
    public readonly DateTime CreationTime;

    public Config()
    {
        // readonly 字段可以在构造函数中初始化
        CreationTime = DateTime.Now; 
    }
}

二、 枚举 (enum)

枚举 (enum)允许我们定义一个由一组命名的常量组成的集合,这个集合本身成为一个新的类型。

如何声明和使用枚举?

使用 enum 关键字来定义。

csharp 复制代码
// 定义一个订单状态的枚举
public enum OrderStatus
{
    Pending,    // 待处理
    Processing, // 处理中
    Shipped,    // 已发货
    Completed,  // 已完成
    Cancelled   // 已取消
}

现在,OrderStatus 就成了一个新的数据类型。我们可以这样使用它:

csharp 复制代码
// 声明一个枚举类型的变量
OrderStatus currentStatus = OrderStatus.Pending;

// 在逻辑判断中使用,代码清晰易读
if (currentStatus == OrderStatus.Shipped)
{
    Console.WriteLine("订单已发货!");
}

// 在 switch 语句中使用,是枚举的最佳拍档
switch (currentStatus)
{
    case OrderStatus.Pending:
        // ...
        break;
    case OrderStatus.Processing:
        // ...
        break;
    // ... 其他状态
    default:
        // ...
        break;
}

枚举的优势:

  1. 强类型安全 :你不能将一个随意的整数赋给一个枚举变量,编译器会阻止你犯错。这避免了将无效的状态码(比如 orderStatus = 10)赋给变量的可能。
  2. 极佳的可读性OrderStatus.Completed 清晰地表达了其含义,而数字 3 则不能。你的代码会变得"自解释"。
  3. 智能提示(IntelliSense):在Visual Studio等IDE中,当你输入枚举变量时,会自动提示所有可用的成员,极大提高了开发效率并减少了拼写错误。

枚举的底层机制

默认情况下,枚举的每个成员都对应一个整数,从0开始依次递增 (Pending 是 0, Processing 是 1, ...)。你也可以显式地为它们指定值,或者更改其底层的类型(默认为 int)。

csharp 复制代码
public enum ErrorCode : ushort // 可以指定底层类型
{
    None = 0,
    NotFound = 404,
    InternalServerError = 500,
    AccessDenied = 403
}

结语

点个赞,关注我获取更多实用 C# 技术干货!如果觉得有用,记得收藏本文!

相关推荐
Jutick4 分钟前
揭秘低延迟:WebSocket 实时行情如何拯救你的量化策略?——Python 生产级实现
前端
~欲买桂花同载酒~5 分钟前
项目优化-vite打包优化
前端·javascript·vue.js
林夕sama7 分钟前
多线程基础(五)
java·开发语言·前端
我叫蒙奇11 分钟前
husky 和 lint-staged
前端
kyriewen12 分钟前
JavaScript 继承的七种姿势:从“原型链”到“class”的进化史
前端·javascript·ecmascript 6
穷鱼子酱15 分钟前
ElSelect二次封装组件-实现分页(下拉加载、缓存)、回显
前端
科科睡不着16 分钟前
拆解iOS实况照片📷 - 附React web实现
前端
前端老兵AI17 分钟前
Electron 桌面应用开发入门:前端工程师的跨平台利器
前端·electron
胖子不胖18 分钟前
浅析cubic-bezier
前端
reasonsummer23 分钟前
【办公类-133-02】20260319_学区化展示PPT_02_python(图片合并文件夹、提取同名图片归类文件夹、图片编号、图片GIF)
前端·数据库·powerpoint