web-dev-qa-db-fra.com

Déclaration d'un tableau d'octets constants longs

J'ai un tableau d'octets long que je dois déclarer dans mon code C #. Je fais quelque chose comme ça:

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

Mais j'obtiens une erreur que le tableau const peut être initialisé uniquement avec des valeurs NULL.

Si je change const en static, il compile, mais la question que j'ai est celle-ci: lorsque je le déclare en tant que public static byte[] gLongByteArray, il ne sera pas initialisé à chaque chargement de mon application, n'est-ce pas? Dans ce cas, la variable gLongByteArray pointe simplement sur un tableau défini dans le fichier compilé exe/dll chargé en mémoire. Je pose la question parce que ce tableau est assez long et que je ne veux pas que mon programme gaspille des cycles de processeur en le chargeant à chaque démarrage de l'application, ou pire encore, cette classe est référencée ...

14
ahmd0

Constantes à la compilation} (celles déclarées avec le mot clé const) sont sévèrement restreintes. Aucun code ne doit être exécuté pour obtenir une telle constante, sinon, il ne pourrait pas s'agir d'une constante de compilation. Les constantes const sont static par défaut.

Si vous voulez créer une constante et que vous ne pouvez pas utiliser une constante de compilation, vous pouvez utiliser static readonly à la place:

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

Le mot clé static garantit qu'il n'est initialisé qu'une seule fois et qu'il fait partie du type déclarant (et non de chaque instance). Le mot clé readonly garantit que la longByteArrayvariable _ ne puisse pas être modifiée ultérieurement.

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

Warning : Un tableau est modifiable, donc dans le code ci-dessus, I peut continue de le faire:

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

Pour éviter cela, faites du type non pas un tableau, mais une interface de collection en lecture seule, telle que IEnumerable<T> ou IReadOnlyList<T> , voire mieux, un type de collection en lecture seule tel que ReadOnlyCollection<T> qui ne ne permet même pas la modification par la coulée.

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

Vous ne pouvez pas créer un tableau const. Selon la documentation :

Les types définis par l'utilisateur, y compris les classes, les structures et les tableaux, ne peuvent pas êtreconst.

Vous devez le déclarer comme un champ statique en lecture seule comme celui-ci.

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

Bien sûr, rien n'empêche quelqu'un d'écraser vos éléments de tableau au moment de l'exécution, comme ceci:

Definitions.gLongByteArray[0] = 0xFF; 

Vous devez utiliser l'une des collections intégrées que @Virtlink suggère ou crée votre propre classe de tableau readonly personnalisée pour empêcher cela ( exemple ).

3
p.s.w.g

les classes statiques seront initialisées lors du premier chargement de l'application. Ne vous inquiétez pas pour la performance, sauf si vous avez spécifiquement mesuré que c'est un problème. 

0
rein

Écrivez tout le contenu dans un fichier et intégrez-le comme ressource!

0
IlPADlI