声明一个长的常量字节数组

时间:2013-03-21 23:23:20

标签: c# arrays const

我有一个长字节数组,我需要在C#代码中声明。我做这样的事情:

public static class Definitions
{
    public const byte[] gLongByteArray = new byte[] { 
        1, 2, 3,
        //and so on
    };
}

但是我得到一个错误,即const数组只能用空值初始化。

如果我将const更改为static它会编译,但我的问题就是这个 - 当我将其声明为public static byte[] gLongByteArray时,每次我的应用加载时都不会初始化它, 对?在这种情况下,gLongByteArray变量将简单地指向在已加载到内存中的已编译exe / dll文件中定义的数组。我问的原因是因为这个数组很长,我不希望我的程序在每次应用程序启动时浪费CPU周期加载它,或者更糟糕的是,这个类被引用...

4 个答案:

答案 0 :(得分:31)

编译时常量(使用const关键字声明的那些)受到严格限制。必须执行代码才能获得这样的常量,否则它不能是编译时常量。 const常量默认为static

如果要创建常量而不能使用编译时常量,可以使用static readonly代替:

public static readonly byte[] longByteArray = new byte[] { 1, 2, 3, 4, 5 };

static关键字确保它只初始化一次,并且是声明类型的一部分(而不是每个实例)。 readonly关键字确保之后无法更改longByteArray 变量

Definitions.longByteArray = new byte[] { 4, 5, 6 };   // Not possible.

警告:数组是可变的,所以在上面的代码中我可以仍然这样做:

Definitions.longByteArray[3] = 82;                    // Allowed.

为了防止这种情况,使类型不是数组而是只读集合接口,例如IEnumerable<T>IReadOnlyList<T>,或者更好的是只读集合类型,例如{{3}它甚至不允许通过强制修改。

public static readonly IReadOnlyList<byte> longByteArray = new byte[] { 1, 2, 3, 4, 5 };

答案 1 :(得分:3)

您无法制作const数组。根据{{​​3}}:

  

用户定义的类型(包括类,结构和数组)不能 const

你必须将它声明为像这样的静态只读字段

public static class Definitions
{
    public static readonly byte[] gLongByteArray = new byte[] { 
        1, 2, 3,
        //and so on
    };
}

当然,没有什么可以阻止某人在运行时覆盖您的数组元素,如下所示:

Definitions.gLongByteArray[0] = 0xFF; 

您必须使用 @Virtlink 建议的其中一个内置集合,或者创建您自己的自定义只读数组类以防止它(documentation)。

答案 2 :(得分:0)

首次加载应用程序时,将初始化

静态类。除非您特别测量到它是一个问题,否则不要担心性能。

答案 3 :(得分:0)

将所有内容写入文件并嵌入资源!