声明一个长的常量字节数组
我有一个长字节数组,我需要在我的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周期加载它,或者更糟糕的是,这个类被引用…
编译时常量 (使用const
关键字声明的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
或IReadOnlyList
,或者更好的是只读集合类型,例如ReadOnlyCollection
,它甚至不是允许通过铸造进行修改
public static readonly IReadOnlyList 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建议的其中一个内置集合,或者创建自己的自定义只读数组类来防止这种情况( 示例 )。
首次加载应用程序时,将初始化静态类。 除非您特别测量到这是一个问题,否则不要担心性能。
将所有内容写入文件并嵌入为资源!