Nu, nu poate face acest lucru, deoarece nu există nici o modalitate de a exprima constantă în timp pentru o valoare.
Dacă compilatorul ar fi capabil să facă acest lucru, ar trebui să existe o garanție din codul care returnează valoarea că valoarea este constantă și pe durata bucla nu se va schimba.
Dar, în acest caz, aveți libertatea de a adăuga noi rânduri în tabelul de date, ca parte a bucla dvs. și, prin urmare, depinde de dvs. să faceți această garanție, așa cum ați făcut-o.
Deci, pe scurt, compilatorul nu va face această optimizare dacă indicele final este altceva decât o variabilă.
În cazul unei variabile, în cazul în care compilatorul poate doar să privească codul de buclă și să vadă că această variabilă particulară nu este schimbată, s-ar putea să o facă și să încarce valoarea într-un registru înainte de a începe bucla, dar orice câștig de performanță din acest ar fi cel mai probabil neglijabil, cu excepția cazului în care corpul dvs. de buclă este gol.
Concluzie: Dacă știți sau doriți să acceptați că indicele de buclă finală este constantă pe durata bucla, plasați-o într-o variabilă.
Edit: Re-read your post, and yes, you might see negligible performance gains for your two cases as well, because the JITter optimizes the code. The JITter might optimize your end-index read into a direct access to the variable inside the data table that contains the row count, and a memory read isn't all that expensive anyway. If, on the other hand, reading that property was a very expensive operation, you'd see a more noticable difference.