Non, il ne peut pas le faire car il n'y a pas moyen d'exprimer constante au fil du temps pour une valeur.
Si le compilateur devrait être capable de faire cela, il devrait y avoir une garantie du code retournant la valeur que la valeur est constante, et pour la durée de la boucle ne changera pas. Mais, dans ce cas, vous êtes libre d'ajouter de nouvelles lignes à la table de données dans le cadre de votre boucle, et c'est à vous de faire cette garantie, comme vous l'avez fait. Donc, en résumé, le compilateur n'effectuera pas cette optimisation si l'index final est autre chose qu'une variable. Dans le cas d'une variable, où le compilateur peut simplement regarder le code de boucle et voir que cette variable particulière n'est pas changée, il peut le faire et charger la valeur dans un registre avant de démarrer la boucle, mais tout le gain de performance de ce serait probablement négligeable, à moins que votre corps de boucle ne soit vide. Conclusion: Si vous savez ou êtes prêt à accepter que l'indice de fin de boucle est constant pendant la durée de la boucle, placez-le dans une variable.
Edit: Relisez votre message, et oui, vous pourriez voir des gains de performance négligeable pour vos deux cas également, parce que le JITter optimise le code. Le JITter peut optimiser votre lecture de l'index final en un accès direct à la variable dans la table de données qui contient le nombre de lignes, et une lecture en mémoire n'est pas si chère de toute façon. Si, d'un autre côté, lire cette propriété était une opération très coûteuse, vous verriez une différence plus notable.