c#.net中const和readonly的区别

 更新时间:2013年09月29日 16:38:11   作者:  
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的方式来解决。但两者之间还是有一点细微的差别的。看下面两个不同的文件。
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常量。

相关文章

  • 深入理解Asp.Net中WebForm的生命周期

    深入理解Asp.Net中WebForm的生命周期

    这篇文章主要给大家介绍了关于Asp.Net中WebForm生命周期的相关资料,文中介绍的非常星系,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • asp.net实现批量删除实例

    asp.net实现批量删除实例

    这篇文章主要介绍了asp.net实现批量删除的方法,需要的朋友可以参考下
    2014-08-08
  • asp.net反射简单应用实例

    asp.net反射简单应用实例

    这篇文章主要介绍了asp.net反射简单应用,结合完整实例形式分析了asp.net反射的原理与简单使用方法,需要的朋友可以参考下
    2017-02-02
  • .net core如何在网络高并发下提高JSON的处理效率详解

    .net core如何在网络高并发下提高JSON的处理效率详解

    这篇文章主要给大家介绍了关于.net core如何在网络高并发下提高JSON的处理效率的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 详解ASP.NET Core 网站发布到Linux服务器

    详解ASP.NET Core 网站发布到Linux服务器

    本篇文章主要介绍了ASP.NET Core 网站发布到Linux服务器 。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • asp.net mvc signalr简单聊天室制作过程分析

    asp.net mvc signalr简单聊天室制作过程分析

    这篇文章主要为大家分析了asp.net mvc signalr简单聊天室制作过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 强大的 .NET 日志库Serilog详解

    强大的 .NET 日志库Serilog详解

    Serilog是一个功能强大的.NET日志记录库,支持多种日志级别、输出方式和格式化选项,具有可扩展性和灵活性,通过本文,您可以了解Serilog的基础知识、API使用、配置和一些常见示例,感兴趣的朋友一起看看吧
    2025-03-03
  • .NET 8 强大功能 IHostedService 与 BackgroundService 实战教程

    .NET 8 强大功能 IHostedService 与 Backgr

    .NET 8 中的 IHostedService 和 BackgroundService 提供了强大的工具集,使定时任务、后台处理以及定期维护等功能的实现变得更加直接、高效和灵活,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • ASP.NET MVC5网站开发文章管理架构(七)

    ASP.NET MVC5网站开发文章管理架构(七)

    继上一篇把member的用户部分完成,现在开始做文章管理部分。文章部分根据涉及显示现实文章列表,发布文章,修改和删除文章等功能。最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示全部文章列表和我的文章列表,普通用户只显示我的文章列表
    2015-09-09
  • .Net中如何将一个实例的内存二进制内容读出来(超简单方法)

    .Net中如何将一个实例的内存二进制内容读出来(超简单方法)

    这篇文章主要介绍了如何将一个实例的内存二进制内容读出来(超简单方法),接下来的内容中,我们将利用一个简单的方法输出指定实例的字节序列,并此次分析值类型和引用类型实例在内存的布局,需要的朋友可以参考下
    2023-07-07

最新评论