比较C#中的readonly与const

比较C#中的readonly与const
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。

工作原理
readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。
const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。
下面声明两个常量:

public static readonly int A = 2; //A为运行时常量
public const int B = 3; //B为编译时常量
下面的表达式:

int C = A + B;
经过编译后与下面的形式等价:

int C = A + 3;
可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。

声明及初始化
readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。
const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。

数据类型支持
由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:

public const DateTime D = DateTime.MinValue;
改成readonly就可以正常编译:

public readonly DateTime D = DateTime.MinValue;

可维护性
readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。
const的情况要稍稍复杂些,特别是跨程序集调用:

public class Class1
{
public static readonly int A = 2; //A为运行时常量
public const int B = 3; //B为编译时常量
}

public class Class2
{
public static int C = Class1.A + Class1.B; //变量C的值为A、B之和
}

Console.WriteLine(Class2.C); //输出"5"
假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:

public class Class1
{
public static readonly int A = 4; //A为运行时常量
public const int B = 5; //B为编译时常量
}
编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:

Console.WriteLine(Class2.C); //输出"7"
结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:

public static int C = Class1.A + Class1.B;
编译后与下面的形式等价:

public static int C = Class1.A + 3;
因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。

性能比较
const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。

适用场景
在下面两种情况下:
a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等)
b.对程序性能要求非常苛刻
可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。
C#中switch语句的case后面要求是常量表达式。下面是一篇关于C#中switch语句的详细文章: 这意味着在每个case后面的值必须是在编译时已知的值,而不能是在运行时才能确定的变量。在C#编程中,switch语句是一种有用的控制结构,它允许根据表达式的不同值来执行不同的代码块。在使用switch语句时,我们需要注意的是,case后面的值必须是常量表达式。语句结束,以避免执行其他case的代码块。的不同值执行不同的代码块。关键字定义一个默认的代码块,它将在没有匹配的情况下执行。需要注意的是,switch语句中的每个case都需要以。的值,相应的代码块将被执行。的值为2,所以执行的代码块是。 阅读详情

相关推荐

开源项目evo2安装教程

Evo 2 是一种先进的 DNA 语言模型,用于长上下文建模和设计。Evo 2 使用 StripedHyena 2 架构在单核苷酸分辨率下对 DNA 序列进行建模,上下文长度可达 100 万碱基对。Evo 2 使用 Savanna 进行预训练,并在 OpenGenome2 数据集上进行自回归训练,该数据集包含来自所有生命领域的 8.8 万亿个标记。

猿小白的博客 896

C#readonlyconst

可以看出readonly修饰的值类型,值类型的成员变量也将是readonly的,但是修饰引用类型时,其本质是一个常量指针,引用类型的成员变量是不受readonly修饰符约束的。可以在字段声明和构造函数中多次分配和重新分配只读字段,在其他时候则是无法赋值的。3)const修饰的变量不能再用static变量进行修饰,并且其只能在字段的声明中初始化。C#中的const没有C++中那么灵活,所能修饰的变量类型很有限。1)readonly修饰的变量是在运行时才进行赋值的。2)readonly修饰值类型和引用类型。.

qq_42987967的博客 1044

大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)

大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 2000张标注好的数据(高分项目)大作业-YOLOV5口罩检测数据集+代码+模型 200

C#中constreadonly有什么区别?

C#中constreadonly什么区别? 您什么时候可以使用另一个?

p15097962069的博客 978

化解一个误区,其实switch和enum是可以很方便配合使用的

enum switch case label must be the unqualified name of an enumeration constant或 错误: 枚举 switchcase 标签必须为枚举常量的非限定名称case ColorType.GREEN:     在咱们Android开发中,有一个变量可能会被很多界面引用,所以我们就会在它前面增加static final publi

bright789的博客 7万+

C#中的static、readonlyconst比较

[csharp] view plaincopy  C#中有两种常量类型,分别为readonly(运行时常量)const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。   工作原理       readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。       const为编译时常量,程序编

起飞的地方 4867

C#中的readonlyconst比较

C#中有两种常量类型,分别为readonly(运行时常量)const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 工作原理 readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。 const为编译时常量,程序编译时将对...

chuanmankan8873的博客 198

比较C#中的readonlyconst (转)

C#中有两种常量类型,分别为readonly(运行时常量)const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 工作原理    readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。    const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。    下面声明两个常量: public s...

weixin_34409741的博客 81

Switch case语句

switch 是“开关”的意思,它也是一种“选择”语句,但它的用法非常简单。switch 是多分支选择语句。说得通俗点,多分支就是多个 if。 从功能上说,switch 语句和 if 语句完全可以相互取代。但从编程的角度,它们又各有各的特点,所以至今为止也不能说谁可以完全取代谁。 当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。但是当选择的分支比较多时,嵌套的 if 语句层数就会很多,导致程序冗长,可读性下降。因此C语言提供 switch 语句来处理多分支选择。所以 if 和 swi

xiaolaoban0413的博客 1148

switch..case 使用枚举值时Constant expression required

在日常开发中,总会有时候我们会需要使用枚举中的值去进行if判断,但由于多条件,所以我们可能想用switch..case来简化代码。如果允许switch语句中的表达式为任何类型,编译器将不得不生成更复杂的字节码来处理switch语句中可能使用的不同类型的值。这将使字节码的效率更低,更难以预测,从而可能导致更慢的执行时间和更困难的调试。所以:对Java中switch语句中可使用的值类型的限制旨在通过将可使用的值类型限制为可以使用简单的相等性测试进行比较的值类型,从而确保switch语句是高效和可预测的。

小草飞上天 1万+

记一次使用switch时使用枚举类型导致constant expression required

枚举类如下 /** * 保证金操作原因类型 */ public enum ReasonEnum { REASON1(1,"保证金-缴存"), REASON2(2,"保证金-解冻"), REASON3(3,"保证金-解冻(退款锁定)"), REASON4(4,"保证金-缴存(退款锁定)"), REASON5(5,"保证金-解冻(维权锁定)"), ...

qq_42643690的博客 2408

C# constreadonly

const(常量)readonly(只读字段)二者都是用于定义不可变变量的,但是有区别。常量的值必须在声明的时候就初始化,并且在编译时已知.不能在运行的时候动态计算。定义了常量MaxValue,值为100。readonly任意类型都可以描述。我们首先定义一个Class1类。const只能描述值类型和枚举。只读字段使用对象调用。

2401_88203167的博客 214

C#constreadonly的区别

(1) const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化 (2) const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候 此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。 (3) const默认就是静态的,而readonly如果设置成静态的就必须显示声明。 (4) const修饰的值的类型也有限制,它只能为下列类型之一(或能够转换为下列类型):s

weixin_46879188的博客 3161
上一篇: string和stringBuilder区别
下一篇: 一個結合where、group、orderby的linq語法
pmandy
博客等级 码龄17年 13粉丝 155原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值