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

ahm*_*md0 16 c# arrays const

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

public static class Definitions
{
    public const byte[] gLongByteArray = new byte[] { 
        1, 2, 3,
        //and so on
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ker 35

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

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

public static readonly byte[] longByteArray = new byte[] { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)

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

Definitions.longByteArray = new byte[] { 4, 5, 6 };   // Not possible.
Run Code Online (Sandbox Code Playgroud)

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

Definitions.longByteArray[3] = 82;                    // Allowed.
Run Code Online (Sandbox Code Playgroud)

为了防止这种情况,使类型不是数组而是只读集合接口,例如IEnumerable<T>or IReadOnlyList<T>,或甚至更好的只读集合类型,例如ReadOnlyCollection<T>甚至不允许通过强制转换进行修改.

public static readonly IReadOnlyList<byte> longByteArray = new byte[] { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)


p.s*_*w.g 5

你不能做一个const数组。根据文档

用户定义的类型,包括类、结构和数组,不能是const.

您必须像这样将其声明为静态只读字段

public static class Definitions
{
    public static readonly byte[] gLongByteArray = new byte[] { 
        1, 2, 3,
        //and so on
    };
}
Run Code Online (Sandbox Code Playgroud)

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

Definitions.gLongByteArray[0] = 0xFF; 
Run Code Online (Sandbox Code Playgroud)

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