在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
只读:可以在运行时通过Ctor更改值。但不通过成员函数
常量:默认情况下为静态。值不能从任何位置更改(Ctor、Function、runtime等no where)
其他回答
我们办公室的一名团队成员就何时使用常量、静态和只读提供了以下指导:
当您有一个在运行时可以知道的类型的变量(string literal、int、double、enums…),您希望类的所有实例或使用者都可以访问值不应更改的位置时,请使用const。如果您希望类的所有实例或使用者都可以访问值可以更改的数据,请使用静态。当您有一个在运行时无法知道的类型的变量(对象),您希望类的所有实例或使用者都可以访问值不应更改的位置时,请使用静态只读。当您有一个实例级变量时,您将在创建对象时知道该变量不应更改,请使用readonly。
最后一个注意事项:常量字段是静态的,但反之则不是真的。
Const:应用程序生命周期内的绝对常量值。
只读:可以在运行时更改。
又一次抓住了。由于const实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。
另外,只读引用类型只会使引用只读,而不会使值只读。例如:
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};
public UpdateReadonly()
{
I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
I_RO_VALUE = new char[]{'V'}; //will cause compiler error
}
}
常量将作为文本值编译到使用者中,而静态字符串将作为对定义值的引用。
作为练习,尝试创建一个外部库并在控制台应用程序中使用它,然后更改库中的值并重新编译它(而不重新编译用户程序),将DLL放入目录并手动运行EXE,您应该会发现常量字符串没有改变。