2010-08-10 4 views
2

Je voulais suivre quelques excellents conseils C de du calcul de la longueur du tableau une fois, puis en utilisant une valeur sans avoir à appeler une fonction comme ceci:Pourquoi Array.Length et Array.Count() ne peuvent-ils pas être affectés à des valeurs const?

Au lieu de:

for(int i = 0; i < arr.length; ++i) 

J'écris

const int size = arr.length; // or arr.Count() 
for(int i = 0; i < size; ++i) 

Après avoir lu un thread différent (Is it costly to do array.length or list.count in a loop) j'ai remarqué que le gain de performance est discutable et que c'est du C# et pas du C++.

La deuxième raison est d'initialiser mon tableau avec une valeur:

const int size = arr.Length;

int[] primes_ = new int[size];

Alors ma question est la suivante:

Pourquoi ne puis-je déclarer toute façon ? Il me crache l'erreur:

Error 2 The expression being assigned to 'length' must be constant

Ce qui est très déroutant parce que ma valeur est constante. Cependant, quand j'enlève le const, poof va le message. ...Quelle?

L'initialisation de longueur se lit:

public int Length {get;} de MSDN. Ce qui est particulièrement déroutant parce que ma dernière question (Get-Set Accessor functionality differs on existence of get-set keyword) m'a donné explicitement la réponse de "Il n'est pas possible de déclarer seulement obtenir et laisser ensemble absent."

Je ne comprends pas pourquoi je peux déclarer int size = arr.Length, mais pas const int size = arr.Length. Pourquoi cela est-il ainsi?

+1

Ceci est un dup de questions. La réponse simple est const dans C# signifie la constante de temps de compilation et non pas comme dans C++ où cela signifie assigner une fois –

Répondre

7

Le mot-clé const nécessite la valeur à être connue au moment de la compilation - le compilateur .Net ne peut pas déterminer la valeur de arr.length lorsque vous compilez le code, de sorte que vous pouvez » t l'affecter à un const.

En ce qui concerne votre dernière question au sujet des accesseurs - vous devez déclarer à la fois que si vous utilisez la syntaxe courte de coupe: à savoir private long n { get; private set; }. Si vous utilisez la déclaration de propriété complète et verbeuse avec un champ local, vous pouvez déclarer simplement un get:

private long _n = 0; 
private long N { get { return _n; } } 
4

La définition avec const en C# nécessite un initialiseur qui peut être évalué au moment de la compilation.

Look here.

Vous pouvez utiliser readonly

Questions connexes