声明一个长常量字节数组

本文关键字:常量 字节 字节数 数组 一个 声明 | 更新日期: 2023-09-27 18:05:17

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

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

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

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

声明一个长常量字节数组

编译时常量(使用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>,或者最好是只读集合类型,如ReadOnlyCollection<T>,它甚至不允许通过强制转换进行修改。

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

不能制作const数组。根据文档:

自定义类型,包括类、结构和数组,不能为 const

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

public static class Definitions
{
    public static readonly byte[] gLongByteArray = new byte[] { 
        1, 2, 3,
        //and so on
    };
}
当然,没有什么可以阻止别人在运行时覆盖你的数组元素,像这样:
Definitions.gLongByteArray[0] = 0xFF; 

您必须使用@Virtlink建议的内置集合之一或创建您自己的自定义只读数组类来防止这种情况(示例)。

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

静态类将在第一次加载应用程序时初始化。不要担心性能,除非你已经明确地测量了这是一个问题。