Sunday, May 26, 2019 17:45

Domeniul de definiție al variabilelor

Un concept foarte important în programare este ceea ce numim domeniul de definiție al variabilelor. Deși acest concept ar fi trebuit explicat atunci când am explicat variabilele, nu l-ați fi înțeles prea mult atunci, pentru că se bazează pe lucruri pe care încă nu le-am explicat.

Chiar și acum, vom utiliza un concept încă necunoscut nouă – clase – dar de care ne-am mai lovit înainte în exemplele noastre, și spuneam că putem vedea clasele ca fiind obiecte de sine stătătoare, structuri complete, autosuficiente, cu proprietăți, metode și evenimente. De exemplu, putem spune că mărul este un obiect, masina este un obiect, calculatorul este un obiect, și așa mai departe.

Am specificat de câteva ori și că clasele, la fel ca o mulțime de alte concepte de programare, au un corp delimitat prin acolade de deschidere și de închidere. Când am vorbit despre metode și funcții, am spus că pot fi declarate doar în interiorul corpului unei clase.

Aici este un exemplu simplu al unei clase care conține câteva metode:

Deci, în fragmentul de cod de mai sus, avem o clasă care conține două funcții și o metodă. Vedeți? E simplu. Acum putem explica conceptul de domeniu de definiție al variabilelor. Există mai multe tipuri de domenii de definiții în C#, dar pentru moment ne interesează doar două: variabile de câmp (numite și membri) și variabile locale.

Domeniul de definiție al unei variabile definește zona în care această variabilă este vizibilă și accesibilă. Cu alte cuvinte, o variabilă poate fi accesibilă din orice parte a codului, sau nu. Pentru a înțelege mai bine acest concept nou, să aruncăm o privire la următorul exemplu:

Analizând codul de mai sus, observăm că avem o clasă numită Program, cu o singură metodă numită Main(), și o funcție de tip int, numită Aduna(). În adiție față de ele, avem și două variabile: o variabilă câmp numită variabilaMeaDeCamp și o variabilă locală numită variabilaMeaLocala. Cum putem spune dacă o variabilă este locală sau de câmp? Variabilele de câmp sunt declarate direct în interiorul corpului unei clase. Variabilele locale sunt întotdeauna declarate în interiorul unei structuri în respectiva clasă (metodă, funcție, proprietate, uniune, etc.). Deci, pentru că variabilaMeaDeCamp este declarată în mod direct în interiorul corpului clasei noastre, este o variabilă de câmp. Pe de altă parte, pentru că variabilaMeaLocala este declarată în interiorul corpului funcției Aduna(), acesta devine o variabilă locală. Deci, domeniul de definiție al variabilei noastre devine unul local. Acest lucru înseamnă că variabilaMeaLocala este „vizibilă“ și accesibilă numai în interiorul metodei în care a fost declarată!

In exemplul de mai sus am declarat variabilaMeaLocala în interiorul funcției Aduna(), dar am încercat să o folosim în interiorul metodei Main(), ceea ce este imposibil, din moment ce această variabilă este o variabilă locală și este vizibilă numai în interiorul structurii în care a fost declarată, în cazul nostru, funcția Aduna().

Acesta este motivul pentru care nu vom putea compila și rula codul de mai sus. Compilatorul ne va avertiza cu privire la următoarea eroare: Numele „variabilaMeaLocala“ nu există în contextul curent (The name ‘variabilaMeaLocala’ does not exist in the current context).

variabila nu exista in contextul actual

 

Pe de altă parte, veți vedea că variabilaMeaDeCamp este perfect accesibilă și nu generează o eroare. Acest lucru se datorează faptului că o variabilă câmp – o variabilă care este declarată în interiorul corpului unei clase – este „vizibilă“ și accesibilă oriunde în interiorul acelei clase, indiferent dacă încercăm să o accesăm în interiorul unei metode, a unei funcții sau orice altceva.

Informații Adiționale

Este un obicei bun să declarați întotdeauna variabilele de câmp imediat după acolada de deschidere a clasei dvs., astfel încât acestea să poată fi rapid și ușor văzute de oricine vă va examina codul.

Acum, să schimbăm un pic codul de mai sus. Mutați declarația variabilaMeaLocala din interiorul corpului funcției Aduna() în corpul metodei Main():

Si, surpriză! Eroarea de compilator va dispărea brusc și atât variabila noastră de câmp, cât și cea locală, devin accesibile. Motivul pentru acest lucru se datorează faptului că variabilaMeaLocala a fost declarată în interiorul metodei noastre Main(), unde și încercăm să o folosim, ceea ce este perfect valabil, deoarece domeniul de definiție al variabilaMeaLocala este limitat doar la corpul metodei Main().

Deci, acum că am clarificat diferența dintre domeniul de definiție local și de câmp, să investigăm problema un pic mai adânc. Luați în considerare următorul exemplu:

Putem observa din codul de mai sus ceva ciudat. În primul rând, declarăm trei variabile int cu același nume. Cum este posibil acest lucru?! Nu există nici un conflic de nume? Cum poate compilatorul spune care dintre variabilele „ora” vrem să o afișeze la consola?

Explicația este simplă: variabilele locale pot fi chiar și mai „locale“. La fel cum variabila noastră „ziua“ este o variabilă locală pentru că am declarat-o în corpul metodei AfiseazaMesaj(), și este vizibilă doar în interiorul corpului acestei metode, deoarece am declarat variabilele noastre „ora” în interiorul corpurilor structurii if-else, ele sunt vizibile numai în blocurile acelor părți if-else în care acestea au fost declarate. Examinați următoarea imagine:

domeniul de definiție al variabilelor

domeniul de definiție al variabilelor

Deci, odată ce vom declara o variabilă în interiorul corpului unor structuri, fie o metodă, o funcție, sau chiar un construct if-else, este vizibilă numai în interiorul acelui corp delimitat de acolade de deschidere și de închidere. Acesta este și motivul pentru care putem declara trei variabile, cu exact același nume. Ele sunt declarate în interiorul corpului construcției if-else, și ele trăiesc numai în interiorul acestor corpuri. Ele nu sunt vizibile în exteriorul blocului în care au fost declarate. Dacă avem 100 de blocuri, putem declara o variabilă cu același nume în fiecare dintre aceste blocuri, și nu ar intra în conflict. In orice caz:

Conflict domeniu de definitie al variabilelor

După cum puteți vedea, atunci când încercăm să declarăm două variabile cu același nume în același corp, compilatorul va da o eroare: „O variabilă locală sau funcție numită XXX este deja definită în acest domeniu de definiție“ („A local variable or function named XXX is already defined in this scope„.)

Pentru că o variabilă este vizibilă doar în interiorul corpului structurii în care acesta a fost declarată, codul nostru va genera de asemenea, o eroare. Asta pentru că:

Eroare domeniu de definitie al variabilelor

Deoarece variabilele noastre „ora“ au fost declarate în interiorul corpurilor verificării if-else, ele nu sunt accesibile în interiorul metodei AfiseazaMejaj(), care este un „nivel“ mai sus. Acest lucru ne spune un lucru interesant: o variabilă declarată în interiorul corpului unui construct este vizibilă în interiorul corpului acelui construct, și în interiorul corpului oricărei alte structuri definită în interiorul corpului respectivului construct. Pe de altă parte, o variabilă definită în interiorul unui corp al unui construct care a fost declarat în interiorul corpului unui alt construct, nu este vizibilă pentru constructul exterior. Acesta este și motivul pentru care o variabilă definită în interiorul unei metode nu este vizibilă în interiorul altei metode. Acesta este și motivul pentru care o variabilă declarată în interiorul corpului unei clase este vizibilă pentru orice construcție în interiorul acelei clase.

În cele din urmă, mai există un singru lucru despre care trebuie să discutăm. Ce fel de variabile sunt variabilele declarate ca parametri pentru funcțiile și metodele noastre?

Ele sunt, de asemenea, variabile locale, iar domeniul lor de definiție este valid în întregul corp al metodei sau funcției care le declară.

Comments

comments

Tags: , ,

Leave a Reply