深入理解C#中的readonly与const:区别与应用场景

目录

引言

readonly与const的基本定义

readonly与const的主要区别

readonly与const的使用场景

示例与解析

结论


引言

 const 关键字 - C# reference | Microsoft Learn

只读关键字 - C# reference | Microsoft Learn

        在C#编程中,readonlyconst都是用于声明不可变变量的关键字。然而,它们之间存在一些关键的区别,这些区别决定了它们在不同场景下的适用性。本文将深入探讨readonlyconst的区别,并通过实际示例来说明它们各自的使用场景。

readonly与const的基本定义

  • readonly:用于声明只读字段。这些字段可以在声明时或在构造函数中赋值,但在对象实例化之后,其值就不能再被修改。
  • const:用于声明编译时常量。这些常量的值必须在声明时确定,并且必须是编译时常量表达式。一旦声明,其值就不能再被修改。

readonly与const的主要区别

  1. 赋值时机const必须在声明时赋值,而readonly可以在声明时或构造函数中赋值。
  2. 类型限制const只能用于基本数据类型、枚举类型或字符串类型的字面量;而readonly可以用于任何类型。
  3. 运行时与编译时const的值在编译时确定,而readonly的值在运行时确定。
  4. 静态构造函数readonly静态字段可以在静态构造函数中初始化,而const则不能。
  5. 内存使用const不占用运行时内存(除了字符串字面量),而readonly会占用。

readonly与const的使用场景

  • const:适用于需要在编译时确定其值,并且不会改变的常量,如数学常量、物理常量等。
  • readonly:适用于需要在运行时或基于某些条件确定其值的只读字段,如配置数据、只读属性等。此外,由于readonly可以应用于任何类型,因此它也常用于引用类型的只读字段。

示例与解析

1. const 示例

// 定义一个const常量,用于存储圆周率π的值  
public const double Pi = 3.14159265358979323846;  class Program  
{  static void Main()  {  // 直接使用const常量  Console.WriteLine("Pi的值是: " + Pi);  // 尝试修改const常量的值(这将导致编译错误)  // Pi = 3.0; // 编译错误:无法修改const字段  }  
}  // 解析:  
// 在这个例子中,我们定义了一个名为Pi的const常量,用于存储圆周率的值。由于const常量必须在声明时赋值,并且其值在编译时就已经确定,因此我们不能在后续代码中修改它的值。这保证了Pi的值在整个程序中都是不变的。

 2. readonly 示例(实例字段)

public class Person  
{  // 定义一个readonly实例字段,用于存储人的名字  public readonly string Name;  // 构造函数中初始化readonly字段  public Person(string name)  {  Name = name;  }  // 尝试在方法内部修改readonly字段(这将导致编译错误)  // public void ChangeName(string newName)  // {  //     Name = newName; // 编译错误:无法修改readonly字段  // }  
}  class Program  
{  static void Main()  {  Person alice = new Person("Alice");  Console.WriteLine("Alice的名字是: " + alice.Name);  // 尝试直接修改alice的Name属性(这是不可能的,因为Name是readonly的)  // alice.Name = "Bob"; // 编译错误:无法修改通过只读属性访问的字段  }  
}  // 解析:  
// 在这个例子中,我们定义了一个名为Person的类,并在其中声明了一个readonly实例字段Name。由于Name是readonly的,我们只能在声明时或在构造函数中为其赋值。在Person类的其他方法中(如ChangeName方法,尽管这里被注释掉了),我们不能修改Name的值。同样,在Program类的Main方法中,我们也不能直接修改alice对象的Name属性。

3. readonly 示例(静态字段)

public class Config  
{  // 定义一个readonly静态字段,用于存储配置数据  public static readonly string DatabaseConnectionString = "Server=localhost;Database=MyDatabase;";  // 静态构造函数(可选,但可用于复杂的初始化逻辑)  static Config()  {  // 这里可以执行一些初始化代码,但通常readonly静态字段直接在声明时赋值  }  
}  class Program  
{  static void Main()  {  Console.WriteLine("数据库连接字符串是: " + Config.DatabaseConnectionString);  // 尝试修改readonly静态字段(这将导致编译错误)  // Config.DatabaseConnectionString = "新的连接字符串"; // 编译错误:无法修改通过只读静态属性访问的字段  }  
}  // 解析:  
// 在这个例子中,我们定义了一个名为Config的类,并在其中声明了一个readonly静态字段DatabaseConnectionString,用于存储数据库连接字符串。由于DatabaseConnectionString是readonly的且是静态的,我们只能在声明时或在静态构造函数中为其赋值。在Program类的Main方法中,我们不能修改Config类的DatabaseConnectionString字段的值。这种机制在存储只读配置数据时非常有用。

结论

readonlyconst都是C#中用于声明不可变变量的关键字,但它们之间存在一些关键的区别。了解这些区别并正确使用它们,可以帮助我们编写更高效、更安全的代码。在实际开发中,我们应根据具体需求选择使用readonly还是const

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

error: RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413

当你用sourcetree 提交代码 报错 RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413 4731719459468_.pic.jpg 1、修改缓存区大小 git config --global http.postBuffer 524288000 2、如果是自己公司搭建的git ,让人看看服务端有没有限制 3、尝试…

Doris:倒排索引

目录 一、倒排索引介绍 二、倒排索引语法 2.1建表时创建倒排索引 2.2 已有表增加倒排索引 2.3 删除索引 三、使用倒排索引 3.1 创建带有倒排索引的表 3.2 插入数据 3.3利用倒排索引查询 3.4 自定义分词 一、倒排索引介绍 倒排索引,是信息检索领域常用的索…

FFMpeg rtmp 推送本地yuv文件

可以借鉴的&#xff1a;C使用FFmpeg实现YUV数据编码转视频文件_C 语言_脚本之家 yuv文件下载地址&#xff1a;YUV Sequences 代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <iostream> extern "C" { #include "libav…

Node.js实验指南:完善接口服务器

上一章接口服务器&#xff0c;我们实现了一个异常简单的接口服务器。可能很多人会感觉有点不真实的感觉&#xff0c;接口这么简单吗&#xff1f;没错&#xff0c;就这么简单。 我们在真实项目的前后端对接中&#xff0c;调用接口&#xff0c;拿到数据&#xff0c;就是如此而已…

文心一言 VS 讯飞星火 VS chatgpt (291)-- 算法导论21.3 4题

四、假设想要增加一个 PRINT-SET(x) 操作&#xff0c;它是对于给定的结点 x 打印出 x 所在集合的所有成员&#xff0c;顺序可以任意。如何对一棵不相交集合森林的每个结点仅增加一个属性&#xff0c;使得 PRINT-SET(x) 所花费的时间同 x 所在集合元素的个数呈线性关系&#xff…

金顺心贸易有限公司简介

金顺心贸易有限公司成立于2015年&#xff0c;注册地位于风景如画的广西壮族自治区防城港市东兴市。 金顺心贸易如他们的名字一样&#xff0c;有着实实在在的业绩和口碑的。他们专注于国际贸易&#xff0c;主营越南进口食品&#xff1a;果汁饮料、春卷皮、调味品、汤底、米粉、…

定制聚四氟乙烯架子离心管架子消解管样品架

南京瑞尼克定制离心管架子、消解管架子、微波罐架子等&#xff0c;各种实验室所需器皿样品架。 我司聚四氟乙烯架子优势&#xff1a; 1.耐强腐蚀&#xff08;耐各种强酸强碱和有机溶剂&#xff09; 2.耐高低温&#xff1a;-200至250℃ 3.工艺精制&#xff0c;尺寸&#xff0…

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…

如何实现高精度PCB切割?— 在线式激光切割机解决方案

在线式PCB精密激光切割机是一种专门用于电子行业中印刷电路板&#xff08;PCB&#xff09;切割的高精度设备。以下是关于在线式PCB精密激光切割机的详细信息和特点&#xff1a; 1. 工作原理&#xff1a; 在线式PCB精密激光切割机主要通过激光束的高能量密度对PCB板进行瞬时加热…

git修改文件名称提交

要将Git中的修改文件名称的操作提交&#xff0c;需要按照以下步骤进行&#xff1a; 1. 使用命令行或Git GUI工具打开项目所在的目录。 2. 通过git status命令检查当前的工作状态&#xff0c;确保没有未提交的更改。 3. 使用git mv命令修改文件名称&#xff0c;该命令用于移动…

MessageBox 弹框确定延时

异常描述&#xff1a; MessageBox 弹框确定和取消执行不同操作时&#xff0c;完全加载需要一些时间&#xff0c;如果点击确定过快&#xff0c;可能导致执行错误的操作&#xff0c;可通过设置延时解决 以下设置只能点击确定和取消&#xff0c;没有关闭按钮&#xff0c;Esc健无效…

新手必备!短视频剪辑常用的18个技巧——剪映篇

导入素材&#xff1a;这里我们可以选择自己拍摄好的素材&#xff08;图片、视频或录制好的音频&#xff09;&#xff0c;按照顺序导入剪辑区剪辑。这一步是剪辑的基础&#xff0c;确定剪辑的大体思路与成片框架&#xff01;别忽略了&#xff0c;剪映官方素材库提供的素材&#…

私域流量的深度解析与电商应用

一、私域流量的核心价值 在当今数字化时代&#xff0c;流量成为了企业发展的重要资源。与公域流量相比&#xff0c;私域流量以其独有的私有性和可复用性&#xff0c;为企业提供了与用户建立深度联系的机会。私域流量不仅有助于企业精准触达目标用户&#xff0c;还能通过数据分…

python办公自动化之excel

用到的库&#xff1a;openpyxl 实现效果&#xff1a;读取单元格的值&#xff0c;写入单元格 代码&#xff1a; import openpyxl # 打开现有工作簿 workbookopenpyxl.load_workbook(现有工作簿.xlsx) # 选择一个工作表 sheetworkbook[交易表] # 读取单元格的值 cell_valueshe…

Sentinel如何使用BlockExceptionHandler实现限流/降级错误页面显示

1、修改配置项,打开对Spring MVC端点的保护 spring.cloud.sentinel.filter.enabled=true 2、编写 BlockExceptionHandler的实现类 MyUrlBlockHandler.java package com.codex.terry.sentinel.urlblockhandler;/*** 文件名称: MyUrlBlockHandler.java* 编写人: yh.zeng* 编…

微服务初识(一)

目录 1.什么是微服务&#xff1f;2.为什么出现微服务&#xff1f;2.1微服务的出现与发展2.2 系统架构的演变2.2.1 传统开发模式——单体架构2.2.2分布式架构2.2.3 微服务架构2.2.4 小结 3. 如何实现微服务&#xff1f;3.1 微服务开发3.2 微服务容器镜像构建3.3 微服务容器镜像管…

nginx更新https/ssl证书的步骤

一、上传nginx证书到服务器 上传步骤略。。。 二、更新证书 &#xff08;一&#xff09;确认nginx的安装目录 我这里的环境是/etc/nginx/ &#xff08;二&#xff09;确认nginx的证书目录 查看/etc/nginx/nginx.conf&#xff0c;证书目录就在/etc/nginx目录下 将新的证书tes…

甄选版“论软件系统架构评估”,软考高级,系统架构设计师

论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…

一名HR,在招聘嵌入式开发岗位,为什么感觉一年比一年难?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 1.嵌入式学用不一致, 高…

OPENCV清晰度判断(三)

接上篇&#xff1a; 信息熵 我还尝试了使用信息熵的方式&#xff1a; 图像也可以采用信息熵的方式来计算图像中的信息多少。 基本概念&#xff1a;图像信息熵是一种特征的统计形式&#xff0c;反映了图像中平均信息量的多少。它表示图像灰度分布的聚集特征所包含的信息量。…