前言
今天我们一起来讲讲 C# 中 const 和 readonly 关键字的区别和用法。
const 和 readonly 关键字区别
基本介绍
- const(常量): 在C#中用于声明编译时常量,其值在编译时就必须确定,并且在程序生命周期内不可更改。
- readonly(只读字段): 在C#中用于声明运行时常量,其值可以在声明时或构造函数中初始化,之后不可更改(可通过反射强制修改)。
const 和 readonly 异同点
对比维度constreadonly基础定义编译时常量,值在编译期确定运行时常量,值在运行时确定初始化时机必须在声明时初始化可在声明时或构造函数中初始化支持的数据类型仅支持基元类型(int, float, char, bool等)、string和null引用支持所有类型(包括自定义类和结构体)默认值要求必须显式初始化不需要显示初始化,值类型默认零值,引用类型默认null性能表现零开销访问(直接编译到IL)微小访问开销(作为实例/静态字段分配内存)线程安全天然线程安全实例字段需注意可见性,静态字段线程安全反射修改无法通过反射修改可通过反射强制修改IL元数据标记literal 标记initonly 标记使用场景声明常量字段或本地常量,常量可以是数字、布尔值、字符串或 null 引用等声明依赖注入对象、配置值、运行时计算值等const 和 readonly 关键字使用
const 使用
- public enum UserRole
- {
- Admin,
- User,
- Guest
- }
- public class ConstAndReadonlyExercise
- {
- // const 初始化
- public const int MaxCount = 999;
- public const UserRole CurrentUserRole = UserRole.Admin;
- }
复制代码 编译后 IL 代码:
- literal 关键字:标记为字面量,值直接嵌入调用处的 IL。
- .field public static literal int32 MaxCount = int32(999) // 0x000003e7
- .field public static literal valuetype 'HelloDotNetGuide.CSharp语法.UserRole' CurrentUserRole = int32(0) // 0x00000000
复制代码 readonly 使用
- // readonly 初始化
- public readonly string _applicationName = "HelloDotNetGuide";
- public ConstAndReadonlyExercise()
- {
- _applicationName = "HelloDotNetGuide_V2";
- }
- // 懒汉式单例模式示例
- private static ConstAndReadonlyExercise? _instance;
- private static readonly object _lockObj = new object();
- public static ConstAndReadonlyExercise Instance
- {
- get
- {
- if (_instance == null)
- {
- lock (_lockObj)
- {
- _instance ??= new ConstAndReadonlyExercise();
- }
- }
- return _instance;
- }
- }
- /// <summary>
- /// 反射修改 readonly 字段的值
- /// </summary>
- public static void UpdateApplicationNameValue()
- {
- var instance = new ConstAndReadonlyExercise();
- Console.WriteLine($"初始值: {instance._applicationName}");
- // 输出: 初始值: HelloDotNetGuide_V2
- var field = instance.GetType().GetField("_applicationName");
- field.SetValue(instance, "HelloDotNetGuide_V3");
- Console.WriteLine($"修改后: {instance._applicationName}");
- // 输出: 修改后: HelloDotNetGuide_V3
- }
复制代码 编译后 IL 代码:
- initonly 关键字:标志被 CLR 识别为仅构造函数可写约束。
C#/.NET/.NET Core面试宝典
本文已收录至C#/.NET/.NET Core面试宝典中,更多C#关键字详解请前往C#/.NET/.NET Core面试宝典开放地址查阅。
- 面试宝典地址:https://www.yuque.com/ysgstudyhard/da6e0c
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |