20

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

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

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

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

4

4 回答 4

43

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

public static readonly IReadOnlyList<byte> longByteArray = new byte[] { 1, 2, 3, 4, 5 };
于 2013-03-21T23:26:10.317 回答
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建议的内置集合之一或创建您自己的自定义只读数组类来防止这种情况(示例)。

于 2013-03-21T23:26:02.687 回答
0

首次加载应用程序时将初始化静态类。不要担心性能,除非您专门测量过这是一个问题。

于 2013-03-21T23:27:30.823 回答
0

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

于 2015-02-04T13:44:54.067 回答