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

ops/2025/1/16 6:48:38/

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

1. const(常量)

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

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

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


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

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 变量的值可以修改,除非你同时使用 readonlyconst
示例:
public class Config
{public static int Counter = 0;  // 静态字段
}Config.Counter = 5;  // 静态字段可以修改
Console.WriteLine(Config.Counter);  // 输出:5

  • 优点

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

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

3. readonly(只读)

  • 运行时常量readonly 用于声明字段,它的值可以在构造函数中赋值,但一旦赋值后就不能再更改。readonly 字段通常用于需要在运行时初始化的字段,但一旦初始化后不可更改。
  • 可以是实例或静态字段readonly 字段可以是实例字段,也可以是静态字段。如果是静态字段,它属于类本身;如果是实例字段,它属于类的每个实例。
  • 可以赋值:在构造函数或静态构造函数中可以赋值,但在构造函数外不能再修改。
示例(实例字段):
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 字段不能修改

 示例(静态字段):

public class Config
{public static readonly int MaxUsers = 100;  // 静态只读字段static Config(){// 可以在静态构造函数中赋值}
}Console.WriteLine(Config.MaxUsers);  // 输出:100
// Config.MaxUsers = 200;  // 编译错误,readonly 字段不能修改

  • 优点

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

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

总结: conststaticreadonly 的区别

特性conststaticreadonly
值是否可变不可变(编译时常量)可以修改可以在构造函数中修改,之后不可变
类型限制必须是编译时已知的值任何类型任何类型
作用范围绑定到类型(类),不能绑定到实例绑定到类,不依赖于实例可以是实例字段或静态字段
赋值时机编译时确定可以在任何地方赋值在构造函数中赋值
性能编译时已知,性能较好取决于是否使用实例在运行时确定
  • const:适用于在编译时已知且永远不会改变的常量(如数学常数 PI、某些配置值等)。
  • static:适用于需要在类的所有实例之间共享的值或方法,且这个值是可变的。
  • readonly:适用于值在对象创建时确定,但一旦创建后不能修改的情况,适合需要在运行时初始化的常量。


http://www.ppmy.cn/ops/150489.html

相关文章

微调神经机器翻译模型全流程

MBART: Multilingual Denoising Pre-training for Neural Machine Translation 模型下载 mBART 是一个基于序列到序列的去噪自编码器,使用 BART 目标在多种语言的大规模单语语料库上进行预训练。mBART 是首批通过去噪完整文本在多种语言上预训练序列到序列模型的方…

Redis十大数据类型详解

Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…

Idea+docker通过dockerFile方式往华为云发布项目

一:前置说明 1.1 演示环境 JDK8IDEA 2022.2.1华为云 CentOS 8.2 64bitDocker 26.1.3 注:华为云上已经安装了docker,能够这次拉取镜像等 二:Idea内的相关配置 2.1 docker插件安装 idea->File->settings 进入setting操作也安装docke…

解锁企业数据管理统一身份认证难题,EasyMR助力企业敏捷提效

在数字经济迅猛发展的当下,企业数据量正以令人惊叹的速度持续增长。据IDC研究显示,至2025年,全球数据总量预计将超175 ZB。数据的爆发式增长对企业而言,既是机遇,更是巨大挑战。 如今,大数据已然成为企业决…

虚假星标:GitHub上的“刷星”乱象与应对之道

在开源软件的世界里,GitHub无疑是最重要的平台之一。它不仅是一个代码托管平台,也是一个社交网络,允许开发者通过“点赞”(即加星)来表达对某个项目的喜爱和支持,“星标”(Star)则成…

esp8266 SPIFFS文件系统

安装: github地址:Release Add support for python 3 for Arduino-ESP8266 2.6.x esp8266/arduino-esp8266fs-plugin GitHub 需要注意,本人在尝试2.3.2版本的arduino IDE尝试安装这个插件,但是无法安装成功. 在b站查询相关视频发现有用 1.8版本的arduino 安装成功的,本人也…

机器学习-距离的度量方法

曼哈顿距离(Manhattan Distance),也称为城市街区距离(Taxicab Distance),是两点之间的距离度量方式。它衡量的是在一个网格状的平面上,从一个点到另一个点的距离,计算时只能沿着水平…

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…