Cunoaște Intuit, declarațiile de limbă curs c #
Rezumat: Întregul set de operatori ai limbajului C #. Vom discuta despre avantajele și dezavantajele lor. Repartizarea operatorilor de alegere și de cicluri formează baza procesului algoritmice. Operatorii de limbaj special luata in considerare încercați - captura - în cele din urmă, care să permită organizarea de manipulare excepție. Luați în considerare randamentul operatorului, utilizat ca iteratori. Discută subiectul Infinitului și de calcul membrele matematice. , Algoritmii clasice și li se dă sarcina pe acest subiect.
Proiectul acestui curs poate fi descărcat de aici.
Componența C # operatorii și sintaxa și semantica lor sunt derivate din C ++. Așa cum îi stă un descendent al compoziției parțial completat redefinit sintaxa si semantica operatorilor individuali, am încercat să îmbunătățească caracteristicile lingvistice ale bun programator. Să vedem cum este gestionat limbajul C #.
Operatorul de atribuire
Cele „Expresiile și operațiile“ discutate în detaliu expresia funcționării și atribuire
și numeroase variante care permit construirea expresiile de forma:
Atribuirea sintactic constă din partea stângă și dreaptă, separate printr-o misiune. Partea dreaptă - această expresie. inclusiv expresia cesiuni în ultimul exemplu. Partea stângă - este o variabilă; mai precis: partea stanga este un lvalue - partea stângă a expresiei, care poate fi atribuită o valoare. Variabila este cel mai frecvent caz special al lvaloare.
expresia de atribuire este un exemplu de a exprima un efect secundar. Efectul direct al acestei expresii de calcul este o valoare calculată și tipul expr expresie. Un efect secundar este acela de a atribui valoarea calculată a variabilei din partea stanga.
Expresia cu un efect secundar în C # pot fi ușor convertite în operatorul corespunzător. Ar trebui să fie o expresie duce la virgulă, așa cum se va operator, care poate fi folosit ori de câte ori sintactic limba operatori valabile. Deci, operatorul de atribuire sintactic arată astfel:
Și numeroase variante sunt permise:
iar astfel de situații pot fi atribuite la declarațiile de atribuire. ca:
Acești operatori se obțin din expresiile efectul lateral corespunzător - atribuirea se încheie punct și virgulă. Atunci când expresia cu un efect secundar sunt transformate în operatori. efect secundar are locul său de drept, și stabilește semantica operatorului, și calculul valorii expresiei devine parte a performanței operatorului procesului.
Semantica atribuire
S-ar părea că semantica misiunii este simplu și evident - pentru a calcula partea dreaptă a expresiei și valoarea sa este atribuită la stânga variabilă corespunzătoare. Dar aceasta este doar o descriere generală a semantica. Detalii mult mai dificil. Faptul că partea stângă și pe partea dreapta si au tipurile lor, iar aceste tipuri nu se poate compara. În acest caz, este necesar să se transforme tipul de partea dreaptă pe partea stângă a tipului. Uneori, această transformare este în siguranță și poate fi rulat în mod automat. Uneori, această transformare este periculoasă, iar în cazul în care apare o eroare, care adesea este detectată în timpul compilării.
Să ne numim o vedere spre partea stângă a operatorului de atribuire, iar sursa - partea dreaptă a operatorului de atribuire. Sursa și țintă poate fi atât de semnificative și tipul de referință. Atribuirea va fi numit de referință. în cazul în care obiectivul este un tip de referință. În acest caz, sursa trebuie să fie un tip de referință, sau să se acorde acest tip. Atribuirea se va numi semnificativ. în cazul în care tipul de valoare țintă. În acest caz, sursa trebuie să fie un tip de valoare, sau să se acorde acest tip.
Operațiunea „pachet“ și „despacheta“ - box și unboxing
Se pune întrebarea naturală: este posibil de referință variabilele asociate cu obiecte stocate în grămadă, da variabile semnificative sunt stocate în stivă? Este posibil să se efectueze operația inversă? În C #, astfel de tipuri de capacități de transformare furnizate. Operațiunea „pachet“ (box) permite variabila tipul de valoare „haine pachet de clasă“, creând un obiect pe heap. Această conversie se efectuează în mod automat de fiecare dată când ținta este în clasa de obiect. iar sursa poate fi o variabilă de oricare dintre tipurile relevante. Operațiunea „despacheta“ (unboxing) permite o variabilă de tip obiect „pentru a decomprima și extrage valoarea stocată“. Această conversie se face în mod automat. Valoarea extrasă nu reține informații despre tipul său. Deci, înainte de a atribui această valoare țintă, este necesar să conducă la tipul dorit. Responsabilitatea pentru această reducere este pe programator.
Să ne gândim ce transformări pot fi realizate în procesul de atribuire.
Scopul și sursa de tip de valoare. Aici vorbim despre semantica atribuire semnificativă. În acest caz, sursa și ținta au propria memorie pentru a stoca valori. În cazul în care tipurile de meci țintă și sursă, atunci nu există nici o problemă. Valorile sursei sunt copiate și înlocuite cu valori ale câmpurilor țintă corespunzătoare. Sursă și țintă, apoi să continue să trăiască în mod independent. Ei au propria lor memorie de stocare, după atribuirea aceeași valoare. În cazul în care sunt diferite tipuri, trebuie să tip de conversie. Acesta poate fi în siguranță, și apoi se execută automat. În caz contrar, ar trebui să fie specificat în mod explicit de către programator. Conversiile explicite și implicite în tipul de aritmetică, turnarea, metoda Parse și metodele de clasă Conversia sunt analizate în detaliu în „Tipuri și clase. Variabilele și obiecte.“
Scopul și sursa unui tip de referință. Aici avem semantica unei lucrări de referință - o referințe de atribuire. În acest caz, sursă și țintă valorile sunt referințe la obiecte stocate într-o memorie dinamică ( „heap“). În cazul în care tipurile de sursă și țintă sunt aceleași, atunci nu există nici o problemă. Scopul releului de conectare la obiect la care se referă la atribuirea, și devine o referire la obiectul asociat cu sursa. Rezultat de referință atribuire dublă. Obiectul referit de tinta pierde una dintre legăturile sale și poate fi „agățat“ - un obiect inutil, care nu se mai face referire, astfel încât soarta lui va determina colectorul de gunoi.
După atribuirea obiectului în memorie, care este menționată sursa, este acum legat la cel puțin două link-uri, considerate ca fiind un singur obiect nume diferite. Atribuirea de referință duce la crearea de alias-uri - la apariția unor nume diferite din același obiect. Mai ales, este necesar să se ia în considerare situația în care ținta și / sau sursa este setată la nul - nul de referință nu indică nici un obiect. Dacă această valoare este sursa, tinta de atribuire rezultat ia această valoare și nu se mai face referire la orice obiect. În cazul în care obiectivul a fost stabilit la null. și sursa - nu, ca urmare a misiunii înainte de „agățat“ obiectivul este o referință la obiectul asociat cu sursa.
În cazul în care tipurile de surse și obiectivele sunt diferite, atunci atribuirea fără nici un fel de transformare este posibilă numai în cazul în care sursa este un descendent al clasei părinte, scopul specificat. Scopul este părinte poate fi legată de obiectul urmașilor lor, pentru că, în acest caz, toate domeniile și metodele de mamă și puii sunt și vor fi determinate.
În cazul în care obiectivul nu este deținut de clasa părinte a sursei, atunci atribuirea de referință este posibilă numai dacă este setat în mod explicit o distributie, dar apoi întreaga responsabilitate pentru succesul acestei transformări stă cu programator, pentru a fi siguri că obiectul sursă asociat link-ul, într-adevăr aparține clasei de țintă obiect.
Scopul unui tip de referință, tipul valorii sursei. În acest caz, „on the fly“ tip de valoare este convertită într-o referință. Cum este dualitatea existenței tipuri semnificative și de referință - variabila și obiect? Răspunsul este simplu: în detrimentul de vânzări eficiente operațiuni „pachet“ (box), executat în mod automat.
Această sarcină este posibilă numai în cazul în care obiectivul este în clasa de obiect. Deoarece obiectul de clasă este părintele tuturor claselor, inclusiv pentru clasele relevante pentru o astfel de atribuire nici o eroare nu va avea loc, este întotdeauna posibil.
Scopul unui tip de referință de tip sursă semnificativă. În acest caz, „on the fly“ tip de acces este convertit în sens. Operațiunea „despacheta“ (unboxing) efectuează operația inversă - este „jupuit“ caseta de obiect și preia valoarea stocată. Notă operațiune „unzip“ nu este o operațiune inversă la „pachet“, în sensul strict al cuvântului. Operator obiect obj = x este corectă, dar efectuează următoarea declarație x = obj va duce la eroare. Nu este suficient pentru valoarea stocată în obiectul ambalate coincide exact cu tipul variabilei, care este atribuit obiectului. Trebuie să specificați în mod explicit conversia la tipul dorit.
Blochează sau operatorul compozit
bloc sintactic perceput ca un singur operator și poate fi folosit peste tot în construcții, unde sintaxa cere un singur operator. Corpul buclei. ramură a instrucțiunii if. de obicei, reprezentat de unitate.
declarație nulă
Declarație de gol - este „gol“, se termină cu punct și virgulă. Uneori este util să se ia în considerare absența operatorilor ca declarația goală existentă. Iată un exemplu: