Const vs protected static readonly

时间:2009-02-23 14:41:41

标签: c# .net

我有一个包装类,它封装了一段需要作为字节数组传输的信息。

通过这种方式,该类将必要的头(包括DATA_LENGTH或MESSAGE_TYPE等字段)封装到相应的字节位置。为此,我想在常量中定义位置和长度,例如:

HEADER_DATA_LENGTH_IX = 0;
HEADER_DATA_LENGTH_LENGTH = 2;

表示DATA_LENGTH从0开始,占用两个字节。

但到目前为止,我正在努力使它们成为常量或静态只读字段。 Const无法保护,因此如果使用它,我将无法派生新类并更改常量,另一方面,我可能在派生类中声明新常量并使用它们。

你的方法是什么?

5 个答案:

答案 0 :(得分:4)

如果要在派生类中更改这些参数的值,可以使它们readonly并在派生类的构造函数中更改它们

无论如何我不会让他们const,因为他们不是......

答案 1 :(得分:4)

基本区别在于初始化变量。 'readonly'在初始化时或在构造函数中设置,而'const'在编译时设置。

我认为最重要的决定是你是否要继承该类并覆盖该值。如果你这样做,请继续阅读。否则我认为这不重要。

readonly C#ref:http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

const C#ref:http://msdn.microsoft.com/en-us/library/e6w8fe1b.aspx

答案 2 :(得分:2)

the official c# faq on msdn

回答了这个问题

答案 3 :(得分:0)

我不会让这些不变,因为它们不是常量。当宣布某事为const时,你应该问自己:这可以改变吗?您的消息长度可能会在某一天发生变化,因此最好只读取它们。

答案 4 :(得分:0)

使用常量创建内部类。然后,派生类可以覆盖内部类,并根据需要更改常量。

e.g。基类:

public class Stuff
{
  public class HeaderInformation
  {
    public const int HEADER_DATA_LENGTH_IX = 0;
    public const int  HEADER_DATA_LENGTH_LENGTH = 2;
  }
}

然后派生类可以这样做:

public class DerivedStuff : Stuff
{
  public new class HeaderInformation : Stuff.HeaderInformation
  {
    public new const int HEADER_DATA_LENGTH_IX = 10;
  }
}

这样,你就具有灵活性。在DerivedStuff中,HeaderInformation类包含基类Stuff.HeaderInformation类中的所有常量,但可以更改其中的任何常量,或保留它们中的常量。