网站首页 > 技术文章 正文
在 C# 中,创建一个不可变的变量可以通过以下几种方式实现:
1. 使用readonly关键字
- readonly 修饰符用于声明在类或结构中只能在初始化或构造函数中赋值的字段。
- 一旦被赋值,它的值不能更改。
示例
class Example
{
public readonly int ImmutableValue;
public Example(int value)
{
ImmutableValue = value; // 只能在构造函数中赋值
}
}
Example example = new Example(10);
// example.ImmutableValue = 20; // 编译错误:readonly 字段不能被重新赋值
2. 使用const关键字
- const 声明的变量在编译时必须被赋值,并且其值在运行时不能更改。
- 只能用于修饰静态常量,通常用于声明程序中不会改变的值。
示例
public class Constants
{
public const double Pi = 3.14159;
}
double circumference = 2 * Constants.Pi * radius;
注意
- const 值只能是编译时确定的常量值。
- const 默认是静态的(即可以通过类名直接访问,无需实例化)。
3. 使用init访问器
- init 是 C# 9.0 引入的一种新特性,用于定义只能在对象初始化时赋值的属性。
- 这种方式可以用于定义不可变的对象。
示例
public class Person
{
public string Name { get; init; }
public int Age { get; init; }
}
var person = new Person { Name = "John", Age = 30 };
// person.Age = 40; // 编译错误:init 属性只能在初始化时赋值
4. 使用readonly struct
- 使用 readonly 关键字声明的结构体,其所有字段在初始化后不可变。
- 常用于表示不可变的值对象。
示例
public readonly struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
var point = new Point(10, 20);
// point.X = 30; // 编译错误:无法为只读属性赋值
5. 使用不可变类型(如System.Collections.Immutable)
- 对于集合类型,可以使用 System.Collections.Immutable 提供的不可变集合。
- 这些集合一旦创建,内容不可更改。
示例
using System.Collections.Immutable;
var immutableList = ImmutableList.Create(1, 2, 3);
// immutableList.Add(4); // 编译错误:集合是不可变的
总结
方法 | 特点 |
const | 编译时常量,运行时不能更改。 |
readonly | 初始化或构造函数内赋值后不可更改。 |
init 访问器 | 用于属性的不可变赋值,适用于初始化阶段。 |
readonly struct | 不可变结构体,所有字段初始化后不能更改。 |
不可变集合 | 使用 System.Collections.Immutable 实现不可变集合(如 ImmutableList)。 |
根据需求选择适当的方式来创建不可变变量。
猜你喜欢
- 2025-01-26 Python super()函数:调用父类的构造方法
- 2025-01-26 C语言中结构体struct的用法(c语言结构体中的结构体)
- 2025-01-26 80_VBA 变量的声明和赋值(vba中变量的作用范围)
- 2025-01-26 结构化编程的三种基本结构(结构化编程的三种基本控制结构)
- 2025-01-26 C语言函数的调用原理不理解?深入浅出通俗易懂,一文读懂函数栈
- 2025-01-26 JS奇淫技巧:一行赋值语句,能玩出多少花样?
- 2025-01-26 抽象函数单调性问题中构造策略(抽象函数单调性解题技巧)
- 2025-01-26 面试中的老大难-mysql事务和锁,一次性讲清楚
- 2025-01-26 四问+一图,读懂《助力中小微企业稳增长调结构强能力若干措施》
- 2025-01-26 三菱PLC的简单ST编程示例(三菱plc st语言编程手册)
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)