Const tableau multidimensionnel de l'initialisation
Pourquoi les travaux suivants?
class A
{
public int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
static void Main(string[] args)
{
}
}
Alors que le suivant ne l'est pas?
class A
{
public const int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
static void Main(string[] args)
{
}
}
Il ne permet pas un const type de référence autre que la chaîne à assigner rien d'autre que null. Puisque c'est un tableau (de référence), il doit être attribué null(?). Comment serait-il être initialisé si elle est constante et nulle?
OriginalL'auteur user2255673 | 2013-04-12
Vous devez vous connecter pour publier un commentaire.
Il fait partie de la langue de conception de C#, si je me souviens bien.
const
est réservé pour les éléments qui peuvent avoir leur contenu déduit au moment de la compilation, c'est à dire avant (pendant) le programme est encore construit, puis sur exécuter. Tous les tableaux en C# sont au moment de l'exécution des tableaux (leurs longueurs sont déterminées lorsque le programme s'exécute, pas avant) et donc ils ne peuvent pas être faites dansconst
champs. Je pense que c'est une limitation de C#, mais c'est la façon dont ils ont décidé de le faire.La raison de types de référence peut être null, c'est que
null
est une valeur constante, alors que votre initialiseur (qui est fait au moment de l'exécution) ne l'est pas.null
est intégré dans la langue, donc, par logique, sa valeur est toujours connu, tout le temps (et donc utilisable pour la compilation des types de référence).EDIT:
Vous devriez être en mesure de faire un tableau statique, cependant, qui sera initialisée au moment où il est utilisé, ou au besoin par tout autre code:
Vous pouvez y accéder comme (si elle est encore dans
class A
):J'espère que vous aide
Pour en savoir plus, regardez MSDN: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true
EDITEDIT:
Si vous avez besoin de rivet le tableau statique de code et de ne jamais laisser quelqu'un changement de fois qu'il a été initialisé, il y a le
readonly
mot-clé à cette fin:Gardez à l'esprit, il ne vous empêchera pas de re-affectation de choses dans ces machines à sous, mais c'est aussi fixé comme C# peut vous donner, à vous sauver de bien ou de retourner un nouveau tableau à chaque fois.
Si vous êtes à la recherche de quelque chose comme C++
const * const
vous ne le trouverez pas en C#.Oui, il est tout à fait regrettable. Mais, vous pouvez faire des tableaux statiques d'entiers et de fonctionner sur ceux, j'ai édité ma réponse à vous montrer.
Juste être conscient il n'y a rien de "constant" à ce sujet; n'importe quel morceau de code peut remplacer ou de modifier des éléments de bon gré mal gré.
Non non,
readonly
va empêcher que la réaffectation d'un tout nouveauint[,]
de la matrice de référence. Rien n'arrête l'exécution de codesi[0, 0] = 9999
OriginalL'auteur
Il ne fonctionne pas parce que c'est la restriction sur le
const
mot-clé.De MSDN:
Si vous essayez de définir un tableau qui ne peut pas changer, peut-être que vous devriez utiliser le
readonly
mot-clé, qui limitent les modifications apportées à un champ ou une variable locale, soit de la déclaration ou dans le constructeur.En effet
OriginalL'auteur Alastair Pitts
Constantes sont évalués au moment de la compilation. De la matrice sont des types référence, et la seule façon de créer un type de référence est l'utilisation de la
new
mot-clé (qui est implicite dans votre code).new
ne peut pas être utilisée dans une expression constante, car il ne peut pas être évaluée au moment de la compilation.Voir MSDN: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true
En effet, je devrais probablement avoir mentionné que.
OriginalL'auteur Simon Whitehead