将成员变量声明为只读有哪些好处?它只是为了防止在类的生命周期中有人更改它的值,还是使用这个关键字会导致任何速度或效率的改进?
当前回答
用非常实际的术语来说:
如果在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强制在编译时创建,而单例在运行时创建。
不要忘记有一种变通方法,可以使用out参数在任何构造函数之外设置只读字段。
有点乱,但是:
private readonly int _someNumber;
private readonly string _someText;
public MyClass(int someNumber) : this(data, null)
{ }
public MyClass(int someNumber, string someText)
{
Initialise(out _someNumber, someNumber, out _someText, someText);
}
private void Initialise(out int _someNumber, int someNumber, out string _someText, string someText)
{
//some logic
}
进一步讨论请访问:http://www.adamjamesnaylor.com/2013/01/23/Setting-Readonly-Fields-From-Chained-Constructors.aspx
Readonly可以在声明时初始化,也可以只从构造函数中获取它的值。与const不同,它必须同时进行初始化和声明。 Readonly拥有const所拥有的一切,再加上构造函数初始化
代码https://repl.it/HvRU/1
using System;
class MainClass {
public static void Main (string[] args) {
Console.WriteLine(new Test().c);
Console.WriteLine(new Test("Constructor").c);
Console.WriteLine(new Test().ChangeC()); //Error A readonly field
// `MainClass.Test.c' cannot be assigned to (except in a constructor or a
// variable initializer)
}
public class Test {
public readonly string c = "Hello World";
public Test() {
}
public Test(string val) {
c = val;
}
public string ChangeC() {
c = "Method";
return c ;
}
}
}
readonly关键字用于将成员变量声明为常量,但允许在运行时计算值。这与使用const修饰符声明的常量不同,后者必须在编译时设置其值。使用readonly,您可以在声明中或在字段所属对象的构造函数中设置字段的值。
如果您不想重新编译引用该常量的外部dll(因为它在编译时被替换),也可以使用它。
小心使用私有只读数组。如果客户端将这些对象作为对象公开(您可以像我一样为COM互操作这样做),客户端可以操作数组值。当将数组作为对象返回时,请使用Clone()方法。