将成员变量声明为只读有哪些好处?它只是为了防止在类的生命周期中有人更改它的值,还是使用这个关键字会导致任何速度或效率的改进?


当前回答

如果你有一个预先定义或预先计算的值,需要在整个程序中保持不变,那么你应该使用constant,但如果你有一个值需要在运行时提供,但一旦分配,应该在整个程序中保持不变,你应该使用readonly。例如,如果你必须分配程序的开始时间,或者你必须在对象初始化时存储用户提供的值,并且你必须限制它进一步更改,你应该使用readonly。

其他回答

readonly关键字用于将成员变量声明为常量,但允许在运行时计算值。这与使用const修饰符声明的常量不同,后者必须在编译时设置其值。使用readonly,您可以在声明中或在字段所属对象的构造函数中设置字段的值。

如果您不想重新编译引用该常量的外部dll(因为它在编译时被替换),也可以使用它。

小心使用私有只读数组。如果客户端将这些对象作为对象公开(您可以像我一样为COM互操作这样做),客户端可以操作数组值。当将数组作为对象返回时,请使用Clone()方法。

用非常实际的术语来说:

如果在dll a中使用const,而dll B引用该const,则该const的值将被编译到dll B中。如果您使用该const的新值重新部署dll a, dll B将仍然使用原始值。

如果在dll a和dll B引用中使用该readonly,则运行时将始终查找该readonly。这意味着如果您使用该只读的新值重新部署dll A, dll B将使用该新值。

使用只读标记的另一个有趣的部分是在单例中防止字段初始化。

例如,在csharpdepth的代码中:

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}

readonly在保护字段单例不被初始化两次方面起着很小的作用。另一个细节是,对于上述场景,您不能使用const,因为const强制在编译时创建,而单例在运行时创建。

WPF可以带来性能上的好处,因为它不需要昂贵的DependencyProperties。这对于集合尤其有用