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

在 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.rhkb.cn/news/2031.html

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

相关文章

abap安装cl_json类

文章来自 SAP根据源码导入/ui2/cl_json类 - pikeduo - 博客园 新建一个se38程序,把源码放到里,源码如下 *----------------------------------------------------------------------* * CLASS zcl_json DEFINITION *----------------------------…

day09_kafka高级

文章目录 kafka高级今日课程内容核心概念整理Kafka的数据位移offset**为什么 Kafka 的 offset 就像是“书签”?****实际意义** Kafka的基准/压力测试测试生产的效率测试消费的效率 Kafka的分片与副本机制kafka如何保证数据不丢失生产者端Broker端消费者端相关参数 K…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求:有个长方形的容器,但是需要正方形的网格线,网格线是等比缩放的并且可以无线拖动的,并且添加自适应缩放和动态切换,工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域,Spring Boot 2 凭借其卓越的特性,为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2,以下这份精心…

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法: 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见,可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …

Vue如何构建项目

目录 1.安装Node.js 2.换源(建议) 3.选择一个目录 4.创建一个vue项目 5.验证是否成功 1.安装Node.js 安装18.3或更⾼版本的 Nodejs 点击下载->Node.Js中文网 node -v npm -v 安装好后在windows的cmd窗口下运行 如果能运行出结果就说明安装好了。 2.换源(建议) //…

uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?

前言 在开发微信小程序时,使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时,就遇到了两个非常令人头疼的问题: 层级穿透:由于 textarea 是原生组件,任何元素都无法遮盖住它。当其…

[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]

哈喽盆友们,今天带来《c语言》游戏中[三子棋boss]速通教程!我们的目标是一边编写博文,一边快速用c语言实现三子棋游戏。准备好瓜子,我们计时开始! 前期规划 在速通中,我们必须要有清晰的前期规划&#xf…

Chatper 4: Implementing a GPT model from Scratch To Generate Text

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network with GELU activations4.4 Adding shortcut connections4.5 Connecting at…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…

Termora跨平台 SSH/SFTP/Terminal 客户端工具

前言 Termora一款强大的终端模拟与SSH客户端工具,集SFTP传输、跨平台兼容、Zmodem协议、SSH端口转发、配置同步、宏录制、关键词高亮、密钥管理、多会话命令发送及数据加密于一体,专为追求高效远程工作的您设计。无论是开发、管理还是日常任务&#xff…

音视频入门基础:RTP专题(1)——RTP官方文档下载

一、引言 实时传输协议(Real-time Transport Protocol,简写RTP)是一个网络传输协议,由IETF的多媒体传输工作小组1996年在《RFC 1889》中公布的。 RTP作为因特网标准在《RFC 3550》有详细说明。而《RFC 3551》详细描述了使用最小…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器,基于 Region 内存布局的,不设分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障,而 ZGC 用到了读屏障 染色指针&a…

Redis复制(replica)

Redis主从复制 [Redis主从复制](replica)是一个多Redis实例进行数据同步的过程,其中一个实例是主实例(Master),其他实例是从实例(Slave)。主实例负责处理命令请求,而从实…

React:构建用户界面的JavaScript库

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何使用 Excel 进行多元回归分析?

多元回归分析,一种统计方法,用来探索一个因变量(即结果变量)与多个自变量(即预测变量)之间的关系。广泛用于预测、趋势分析以及因果关系的分析。 听起来这个方法很复杂,但其实在 Excel 中可以很…

Android 调用系统服务接口获取屏幕投影(需要android.uid.system)

媒体投影 借助 Android 5(API 级别 21)中引入的 android.media.projection API,您可以将设备屏幕中的内容截取为可播放、录制或投屏到其他设备(如电视)的媒体流。 Android 14(API 级别 34)引入…

PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录 0.简介1.概念及使用方式2.工作原理2.1 主要功能2.2 清理流程2.3 防止事务id环绕说明 3.使用建议 0.简介 在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式,一种是将旧数据放到回滚段,一种是直接生成一条新数据(对于删除是不删除…

C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

1 图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色,反色就是取像素的互补色,比如当前像素是0X00FFFF,对其取反色就是0XFFFFFF – 0X00FFFF 0XFF0000,依次对图像中的每个像素这样做,最后得到的就是原…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数(中断中恢复) 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend():挂起任务, 类似暂停,可恢复 vTaskResume()&#xff1a…