C# 经典实例 第一章 类和泛型 #1.6 在运行时初始化常量字段

问题:

标记为const的字段只能在编译时初始化。你需要在运行时而不是在编译时将一个字段初始化为一个有效值。然后在应用程序剩余的生命周期内,这个字段必须像一个常量字段那样工作。

解决方案:

在代码中声明一个常量时有两种选择。可以使用readonly字段或const字段,每种方式都有优缺点。不过,如果你需要在运行时初始化一个常量字段,就必须使用readonly字段。

        public class Foo
        {
            public readonly int bar;

            public Foo() { }

            public Foo(int constInitValue) { bar = constInitValue; }

            // 类的其他部分    
        }

使用const字段无法做到这一点。const字段只能在编译时初始化。

        public class Foo
        {
            public const int bar;     // 这一行造成一个编译时错误

            public Foo() { }

            public Foo(int constInitValue)
            {
                bar = constInitValue; // 这一行同样造成一个编译时错误
            }
            // 类的其他部分 
        }

讨论:

readonly字段只允许在运行时在构造函数中执行初始化,而const字段必须在编译时进行初始化。因此,为了让一个必须为常量的字段在运行时初始化,唯一的方式是实现一个readonly字段。

只有两种方式可用于初始化一个readonly字段。第一种方式是向字段自身添加一个初始化器,代码如下所示:

 public readonly int bar = 100;
第二种方式是通过一个构造函数初始化readonly字段。

(注:对于使用const字段的一个常见争论是,他们并不像readonly字段那样支持版本化。如果重新构建一个定义了const字段的组件,并且该const字段的值在之后的版本中发生了改变,那么使用旧版本构建的任何其他组件都不会获得新的值。只要一个字段将来有可能发生改变,就不要把它声明为一个const字段)

参考:

MSDN文档中的“const”和“readonly”关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值