7
votes

C #, comment gérer des tables constantes

Il semble étrange que la langue ne contienne apparemment aucune fonctionnalité appropriée.

Je me trouve avec des données qui seraient mieux exprimées comme une matrice multidimensionnelle, mais elle est totalement constante, il n'ya aucun moyen que personne ne puisse vouloir le changer sans modifier également le code associé. Face à de telles choses à Delphes, la réponse est évidente - une constante dont la valeur est la table. Cependant, c # ne semble pas supporter quelque chose comme ça.

Google affiche de nombreuses personnes qui serrent à ce sujet, pas de bonnes réponses.

Comment les gens gèrent ce genre de situation?

(Et ne disons pas que les constantes n'appartiennent pas au code - la dernière fois que j'ai heurtée était toutes des permutations possibles de 4 articles. Sauf si la nature même de l'espacétime change ceci est placé en pierre.)

Qu'est-ce qui s'est passé ?? Il y avait une réponse qui est venue assez près, je posais un détail et il a disparu! Il suffit de déclarer une sorte de tableau du travail - le seul problème est que l'allocation de la matrice va fonctionner à chaque fois. Celui qui est devant moi contient 96 valeurs - comment puis-je l'obtenir pour initialiser une seule fois? Dois-je juste accepter de l'accepter beaucoup plus large que cela devrait être? (Comme il se trouve, il est dans une routine à 3 lignes qui se trouve à l'intérieur de la routine O (n ^ 3).)


0 commentaires

6 Réponses :


0
votes

énumérations, sûrement.


5 commentaires

Il veut rechercher des valeurs dans une table multidimensionnelle. Il n'y a aucun moyen que vous puissiez utiliser des énumérations pour cela.


aha oui, soudainement la question a plus de sens


Mais je ne vois toujours pas ce que l'inquiétude est à propos. Il n'y a pas besoin de faire la table incapable d'accepter des mises à jour. Tout ce qu'il a à faire est de s'abstenir de rédiger un code qui le met à jour.


Peter, par cette mesure, des mots-clés tels que "const" et "Readonly" doivent être jetés, non? :)


Je ne les jeterais pas. Ils sont inoffensifs, le compilateur est stable et que, pour qu'un certain code représente un changement de rupture. Mais vous avez raison de ne pas les avoir ajoutés en premier lieu. J'ai toujours trouvé une langue plus intéressante pour ce que peut être exprimé que ce qui ne peut pas.



3
votes

0 commentaires

0
votes

Eh bien, j'ai pris l'approche de ce qui suit, c'est un peu désagréable de lire mais facile à éditer. XXX


1 commentaires

Ce n'est pas entièrement constant. Le «Readonly» vous empêche d'échanger GlobalCollection avec un autre [], mais cela ne vous empêche pas d'échanger GlobalCollection [0] ou [1].




1
votes

Vous pouvez utiliser une hache réadonnée. Le seul inconvénient est que Readonly ne vous empêche pas de changer la valeur d'un élément particulier de la haquetable. Donc ce n'est pas vraiment const. xxx

ou un tableau xxx

Oui, vous devrez déclarer la variable dans la portée appropriée afin Il n'est pas initialisé plus d'une fois.


0 commentaires

1
votes

Comme ils em> disent, ajoutez simplement une autre couche d'indirection. C # n'a pas besoin de fournir une structure de données spécialisée en tant que primitive linguistique, bien qu'on souhaite, parfois, il existait une façon de rendre une classe immuable, mais c'est une autre discussion.

Vous n'avez pas mentionné si vous n'avez pas mentionné besoin de stocker différentes choses là-bas. En fait, vous n'avez pas mentionné autre chose que multidimensionnelle et aucune possibilité de modifier les valeurs ou les tableaux. Je ne sais même pas si le modèle d'accès (un seul INT, INT, INT, INT) est approprié. P>

mais en général, pour une matrice déchiquetée à 3 dimensions, les œuvres suivantes (mais cela n'est pas ' t jolie). p>

Une mise en garde est le type que vous construisez-le, il doit également être immuable, mais c'est votre problème. Vous pouvez simplement créer votre propre wrapper en lecture seule. P>

public static int[][][] IntInitializer()
{
    return xyz // something that constructs a [][][]  
}