c#.net中const和readonly的区别
网络编程 2021-07-04 22:40www.168986.cn编程入门
readonly修饰符用来表示只读,const用来表示不变常量。顾名思义,只读表示不能进行写操作;不变常量不能被修改。这两者到底有什么区别呢
(1) readonly和const都是用来标示常量的。
(2) 初始化赋值不同。
const修饰的常量必须在声明的赋值。例如
public class Class1
{
public const int MaxValue = 10; //正确声明
public const MInValue; //错误常量字段要求提供一个值
public Class1()
{
MinValue = 10;
}
}
readonly字段可以在初始化(声明或构造函数)的过程中赋值。,根据所使用的构造函数,readonly字段可能具有不同的值。
public class Class1
{
public readonly int c = 10; //正确声明
public readonly int z;
public Class1()
{
z = 24;//正确
}
protected void Load()
{
z = 24;//错误无法对只读的字段赋值(构造函数或变量初始值指定项中除外)
}
}
readonly是实例成员,所以不同的实例可以有不同的常量值,这是readonly更灵活。
public readonly Color Red = new Color(255, 0, 0);
public readonly Color Green = new Color(0, 255, 0);
public readonly Color Blue = new Color(0, 0, 255);
(3) const字段是编译时常数,而readonly字段可用于运行时常数。
const要求编译器能够在编译时计算出确定的值。在编译的时候,用计算出的这个确定的值去替换调用该常量的每一个地方。不能从一个变量中提取值来初始化常量。
readonly允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。因为readonly是在计算时执行的,所以可以用某些变量初始化。在运行时才确定的该值。
(4) const默认就是静态的,而readonly如果设置成静态的就必须显示声明。
(5) const修饰的值的类型也有限制,它只能为下列类型之一(或能够转换为下列类型)sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum类型或引用类型。注意能够声明为const的引用类型只能为string或值为null的其他引用类型。readonly可以是任何类型。
这就是说,当我们需要一个const的常量时,若他的类型限制了它不能再编译时被计算出确定的值来,那么我们可采取将之声明为static readonly的方式来解决。但两者之间还是有一点细微的差别的。看狼蚁网站SEO优化两个不同的文件。
file1.cs
using System;
namespace MyNamespace1
{
public class MyClass1
{
public static readonly int myField = 10;
}
}
file2.cs
namespace MyNamespace2
{
public class MyClass1
{
public static void Main()
{
Console.WriteLine(MyNamespace1.MyClass1.myField);
}
}
}
两个类分属于两个文件file1.cs和file2.cs,并分开编译。在文件file1.cs内的域myField声明为static readonly时,如果我们由于某种需要将myField的值改为了20,那么我们只需要重新编译文件file1.cs为file1.dll,在执行file2.exe时即会得到20。
但如果将static readonly改变为const后,再改变myField的初始化值时,我们则必须重新编译所有引用到file1.dll的文件,否则我们引用的MyNamespace1.MyClass1.myField将不会如我们所愿而改变。这在大的系统开发过程中尤其需要注意。
(6) object、Array(数组)和struct(结构)不能被声明为const常量。
(2) 初始化赋值不同。
const修饰的常量必须在声明的赋值。例如
代码如下:
public class Class1
{
public const int MaxValue = 10; //正确声明
public const MInValue; //错误常量字段要求提供一个值
public Class1()
{
MinValue = 10;
}
}
readonly字段可以在初始化(声明或构造函数)的过程中赋值。,根据所使用的构造函数,readonly字段可能具有不同的值。
代码如下:
public class Class1
{
public readonly int c = 10; //正确声明
public readonly int z;
public Class1()
{
z = 24;//正确
}
protected void Load()
{
z = 24;//错误无法对只读的字段赋值(构造函数或变量初始值指定项中除外)
}
}
readonly是实例成员,所以不同的实例可以有不同的常量值,这是readonly更灵活。
代码如下:
public readonly Color Red = new Color(255, 0, 0);
public readonly Color Green = new Color(0, 255, 0);
public readonly Color Blue = new Color(0, 0, 255);
(3) const字段是编译时常数,而readonly字段可用于运行时常数。
const要求编译器能够在编译时计算出确定的值。在编译的时候,用计算出的这个确定的值去替换调用该常量的每一个地方。不能从一个变量中提取值来初始化常量。
readonly允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。因为readonly是在计算时执行的,所以可以用某些变量初始化。在运行时才确定的该值。
(4) const默认就是静态的,而readonly如果设置成静态的就必须显示声明。
(5) const修饰的值的类型也有限制,它只能为下列类型之一(或能够转换为下列类型)sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum类型或引用类型。注意能够声明为const的引用类型只能为string或值为null的其他引用类型。readonly可以是任何类型。
这就是说,当我们需要一个const的常量时,若他的类型限制了它不能再编译时被计算出确定的值来,那么我们可采取将之声明为static readonly的方式来解决。但两者之间还是有一点细微的差别的。看狼蚁网站SEO优化两个不同的文件。
file1.cs
代码如下:
using System;
namespace MyNamespace1
{
public class MyClass1
{
public static readonly int myField = 10;
}
}
file2.cs
代码如下:
namespace MyNamespace2
{
public class MyClass1
{
public static void Main()
{
Console.WriteLine(MyNamespace1.MyClass1.myField);
}
}
}
两个类分属于两个文件file1.cs和file2.cs,并分开编译。在文件file1.cs内的域myField声明为static readonly时,如果我们由于某种需要将myField的值改为了20,那么我们只需要重新编译文件file1.cs为file1.dll,在执行file2.exe时即会得到20。
但如果将static readonly改变为const后,再改变myField的初始化值时,我们则必须重新编译所有引用到file1.dll的文件,否则我们引用的MyNamespace1.MyClass1.myField将不会如我们所愿而改变。这在大的系统开发过程中尤其需要注意。
(6) object、Array(数组)和struct(结构)不能被声明为const常量。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程