明霞山资源网 Design By www.htccd.com
(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常量。
标签:
c#,const,readonly

明霞山资源网 Design By www.htccd.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
明霞山资源网 Design By www.htccd.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。