C#:readonly和const用法小结

2024-04-02 19:38

本文主要是介绍C#:readonly和const用法小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们都知道,使用const关键字可以将字段或局部变量声明为常量,其不能被修改。

readonly关键字被用来声明只读字段,主要用于字段。

两者有一定的相似性,但是也有明显的差异性,所以本文将两者结合在一起来进行说明。

一开始,我们先给出四个代码小片段,这些代码小片段的功能都是使用const关键字来定义常量,但是其中某些小片段的做法是不正确的,希望大家能够找出来。

Code1

private const int FIRST_NUM = 1;

Code2:

private static const int SECOND_NUM = 1;

Code3:

int t = 1;
private const int THIRD_NUM = t + 1;

Code4:

private const int FIFTH_NUM = FIRST_NUM + 1;

大家知道哪些代码片段有问题吗?

答案是,代码片段2及代码片段3的做法存在错误

为什么呢?(小沈阳唱着说:为什么呢?)

Code2不正确的原因是:

const 默认就是静态的,所以在声明中显式地加上static 关键字的做法明显是错误的。这一点,可以通过查看IL代码来证明,其中Code1对应的IL代码如下: 

.field private static literal int32 FIRST_NUM = int32(0x00000001)

很显然,常量FIRST_NUM 默认就是静态的(static )。

那么,readonly字段能不能被设置成静态呢?

做个实验就知道了,代码如下:

private static readonly int firstnum = 1;

编译无错,正常。

到这里,可以得出readonly及const的第一个区别:const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明(区别1)。

Code3不正确的原因是:

const 字段只能在该字段的声明中初始化。不能从一个变量中提取值来初始化常量。这里面更深层次的原因就是:const 字段是编译时常数。在编译时就应该确定其具体值。

那么,readonly字段能不能使用变量来进行初始化呢?

同样使用实验来验证我们的想法,代码如下:

public class ReadOnlyAndConstClass
{private readonly int secondnum;public ReadOnlyAndConstClass(){int t = 1;secondnum =t +1;}
}

很显然,是可以的,但必须在构造函数中

这是因为 readonly 是在计算时执行的,当然它可以用某些变量来进行初始化

到这里,总结出readonly及const的第二个区别:

const 字段是编译时常数,而 readonly 字段可用于运行时常数(区别2)。

当然,我们还能得出另外一个不同点:

const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。这说明不同的实例可以有不同的常量值,所以说,使用readonly来定义不变量更加灵活(其实,这也是readonly的最大特点)(区别3)。

最后,补充最后一点区别:

const对于引用类型的常数,可能的值只能是 string 和 null  readonly可以是用于任何类型字段的声明(区别4)。

写到这里了,8181。

这篇关于C#:readonly和const用法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870870

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav