前段时间在CSDN看到有个帖子问关于常量(const )和只读(readonly)的区别,觉得很有意思,于是找了些资料,写了些代码研究了一下。
发现常量和只读变量有以下区别
1.常量必须在声明时就被初始化,指定了值后就不能修改了.只读字段可以在声明时被初始化,也可以在构造函数中指定初始化的值,在构造以后值就不能修改.
2.常量是静态的,而自读字段可以是静态和动态的
3.Const可以用在字段和局部变量,readonly只可以修饰字段
以下是我的测试代码
using System;

//说明:没有编号的字段在声明时不初始化,构造时被初始化
//编号为1的字段在声明时初始化,构造时不被初始化
//编号为2的字段在声明时,构造时都被初始化
//编号为3的字段在声明时,构造时都不被初始化
public class Test

...{
//常量
//常量必须在声明时就被初始化,使用下面语句的出现编译错误"常数字段要求提供一个值"
//const string myConst;
const string myConst="声明时被初始化";
//静态只读
public static readonly string myStaticReadonly;
public static readonly string myStaticReadonly1="声明时被初始化";
public static readonly string myStaticReadonly2="声明时被初始化";
public static readonly string myStaticReadonly3;
//只读
public readonly string myReadonly;
public readonly string myReadonly1="声明时被初始化";
public readonly string myReadonly2="声明时被初始化";
public readonly string myReadonly3;
//默认构造函数
public Test()

...{
myReadonly="默认构造函数时被初始化";
myReadonly2="默认构造函数时被初始化";
}
//带参构造函数
public Test(string arr)

...{
myReadonly=arr;
myReadonly2=arr;
}
//静态构造函数,此函数不能带参数
static Test()

...{
myStaticReadonly="构造时被初始化";
myStaticReadonly2="构造时被初始化";
//常量的值不能在构造函数中被更改,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
//myConst="value";
}
//试验在用静态方法改变常量和自读变量的值
public static void StaticChangeValue()

...{
//常量的值不能被改变,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
//myConst="被改变";
//无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对静态只读字段赋值(静态构造函数或变量初始值设定项中除外)"
//myStaticReadonly="被改变";
}
//试验在用方法改变自读变量的值
public void ChangeValue()

...{
//无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对只读的字段赋值(构造函数或变量初始值指定项中除外)"
//myReadonly="被改变";
}
//试验静态局部常量和自读变量
public static void Include()

...{
const string includeConst="局部静态常量";
//readonly不能修饰静态局部变量
//static readonly includeReadonly="局部静态自读变量";
}
//试验局部自读变量
public void StaticInclude()

...{
//readonly不能修饰局部变量
//readonly staticIncludeReadonly="局部静态自读变量";
}
public static void Main()

...{
//参看静态数据
Console.WriteLine("Test.myConst:"+Test.myConst);
Console.WriteLine("Test.myStaticReadonly:"+Test.myStaticReadonly);
Console.WriteLine("Test.myStaticReadonly1:"+Test.myStaticReadonly1);
Console.WriteLine("Test.myStaticReadonly2:"+Test.myStaticReadonly2);
Console.WriteLine("Test.myStaticReadonly3:"+Test.myStaticReadonly3);
Console.WriteLine("");
Test test=new Test();
Console.WriteLine("test.myReadonly:"+test.myReadonly);
Console.WriteLine("test.myReadonly1:"+test.myReadonly1);
Console.WriteLine("test.myReadonly2"+test.myReadonly2);
Console.WriteLine("test.myReadonly3"+test.myReadonly3);
Console.WriteLine("");
Test test1=new Test("带参构造函数时被初始化");
Console.WriteLine("test1.myReadonly:"+test1.myReadonly);
Console.WriteLine("test1.myReadonly1:"+test1.myReadonly1);
Console.WriteLine("test1.myReadonly2"+test1.myReadonly2);
Console.WriteLine("test1.myReadonly3"+test1.myReadonly3);
Console.WriteLine("");
Console.WriteLine("从结果可以看出构造时初始化的值将覆盖声明时初始化的值");
Console.WriteLine("没有初始化的只读字段被赋予默认值,空值");
Console.Read();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构