(三)c#中const、static、readonly的区别

在 C# 中,const、static 和 readonly 都是用来定义不可变的值,但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点:

1. const(常量)

  • 编译时常量 :const 用于声明常量,其值必须在编译时就已知,且在整个程序运行期间不能改变。
  • 静态 :const 默认是静态的,意味着它与类相关,而不是与类的实例相关。
  • 不能更改 :一旦为 const 赋值,就无法更改。
  • 类型限制 :const 常量只能使用基本数据类型或字符串等可以在编译时确定的类型。
示例:
cs 复制代码
public class Config
{
    public const int MaxUsers = 100;  // 编译时常量,值为 100
}

Console.WriteLine(Config.MaxUsers);  // 输出:100
// Config.MaxUsers = 200;  // 编译错误,常量值不能修改
  • 优点:

    • 编译时已知,性能较好。
    • 可以在任何地方直接使用常量值,避免了魔法数字(magic numbers)。
  • 限制:

    • 必须在编译时确定值。
    • 一旦赋值,值不能改变。

在 C# 中,const、static 和 readonly 都是用来定义不可变的值,但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点:

1. const(常量)

  • 编译时常量 :const 用于声明常量,其值必须在编译时就已知,且在整个程序运行期间不能改变。
  • 静态 :const 默认是静态的,意味着它与类相关,而不是与类的实例相关。
  • 不能更改 :一旦为 const 赋值,就无法更改。
  • 类型限制 :const 常量只能使用基本数据类型或字符串等可以在编译时确定的类型。
示例:
复制代码

csharp

复制代码

public class Config { public const int MaxUsers = 100; // 编译时常量,值为 100 } Console.WriteLine(Config.MaxUsers); // 输出:100 // Config.MaxUsers = 200; // 编译错误,常量值不能修改

  • 优点:

    • 编译时已知,性能较好。
    • 可以在任何地方直接使用常量值,避免了魔法数字(magic numbers)。
  • 限制:

    • 必须在编译时确定值。
    • 一旦赋值,值不能改变。

2. static(静态)

  • 属于类而非实例 :static 关键字声明的字段或方法属于类本身,而不是某个类的实例。静态成员只有一个实例,不管创建多少个类的实例,static 成员都是共享的。
  • 可以修改 :static 变量的值可以修改,除非你同时使用 readonly 或 const。
示例:
cs 复制代码
public class Config
{
    public static int Counter = 0;  // 静态字段
}

Config.Counter = 5;  // 静态字段可以修改
Console.WriteLine(Config.Counter);  // 输出:5
  • 优点:

    • 可以在所有实例之间共享数据或方法。
    • 静态成员不依赖实例,因此可以直接通过类访问。
  • 限制:

    • 不能直接访问实例字段或方法。
    • 值可以被修改,不像 readonly 或 const 那样不能更改。

3. readonly(只读)

  • 运行时常量 :readonly 用于声明字段,它的值可以在构造函数中赋值,但一旦赋值后就不能再更改。readonly 字段通常用于需要在运行时初始化的字段,但一旦初始化后不可更改。
  • 可以是实例或静态字段 :readonly 字段可以是实例字段,也可以是静态字段。如果是静态字段,它属于类本身;如果是实例字段,它属于类的每个实例。
  • 可以赋值:在构造函数或静态构造函数中可以赋值,但在构造函数外不能再修改。
示例(实例字段):
cs 复制代码
public class Config
{
    public readonly int MaxUsers;

    public Config(int maxUsers)
    {
        MaxUsers = maxUsers;  // 在构造函数中赋值
    }
}

var config = new Config(100);
Console.WriteLine(config.MaxUsers);  // 输出:100
// config.MaxUsers = 200;  // 编译错误,readonly 字段不能修改

示例(静态字段):

cs 复制代码
public class Config
{
    public static readonly int MaxUsers = 100;  // 静态只读字段

    static Config()
    {
        // 可以在静态构造函数中赋值
    }
}

Console.WriteLine(Config.MaxUsers);  // 输出:100
// Config.MaxUsers = 200;  // 编译错误,readonly 字段不能修改
  • 优点:

    • 值在运行时设置,但一旦赋值后不可修改。
    • readonly 可以根据程序的运行时环境进行初始化。
  • 限制:

    • 如果是实例字段,必须通过构造函数初始化。
    • 不能更改已赋值的字段。

总结: const、static 和 readonly 的区别

特性 const static readonly
值是否可变 不可变(编译时常量) 可以修改 可以在构造函数中修改,之后不可变
类型限制 必须是编译时已知的值 任何类型 任何类型
作用范围 绑定到类型(类),不能绑定到实例 绑定到类,不依赖于实例 可以是实例字段或静态字段
赋值时机 编译时确定 可以在任何地方赋值 在构造函数中赋值
性能 编译时已知,性能较好 取决于是否使用实例 在运行时确定
  • const :适用于在编译时已知且永远不会改变的常量(如数学常数 PI、某些配置值等)。
  • static:适用于需要在类的所有实例之间共享的值或方法,且这个值是可变的。
  • readonly:适用于值在对象创建时确定,但一旦创建后不能修改的情况,适合需要在运行时初始化的常量。
相关推荐
玩泥巴的4 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
cpp_w8 小时前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet9 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong1239 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
步步为营DotNet10 小时前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
用户788477316341 天前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
csdn_aspnet1 天前
C# .NetCore Swagger ISchemaFilter 处理枚举、特殊类型
c#·.netcore·swagger
滴滴答答哒1 天前
C# 技巧:优雅实现对象的“局部更新”与“字段合并”
开发语言·c#
code_long1 天前
.net core 连接打印机 使用zpl指令打印机,并且位图本地渲染zpl指令
c#·.netcore·位图·打印机·模板编辑·模板预览
csdn_aspnet1 天前
C# .NetCore Swagger ISchemaFilter Long 转 String 防精度丢失
c#·.netcore·swagger