Variabile
Pentru a declara o variabila trebuie sa folosim urmatoarea sintaxa: datatype identifier;
De exemplu: int i; . Aceasta expresie de tip int este numita i. Compilatorul nu te va lasa sa folosesti aceasta variabila intr-o expresie, pana cand i se atribuie o valoare. Dupa ce a fost declarata, ii puteti atribui o valoare prin operatorul “=”, spre exemplu: i = 10; . De asemenea puteti sa declarati variabila si sa ii atribuiti o valoare in acelasi timp: int i = 10; .
Daca vrem sa declaram si sa initializam mai multe variabile intr-o singura structura, spre exemplu int x = 10, y = 20; , tipul de data al lui y este identic cu tipul de data al lui x, in acest caz , tipul de data este int.
Pentru a declara variabile de diferite tipuri, trebuie sa le declaram separat. Nu puteti aloca tipuri diferite de date in cadrul unei declaratii cu mai multe variabile:
int x = 10; bool y = true; // Crearea variabilelor de tip boolean (true & false) int x = 10, bool y = true; // Acesta nu va putea fi compilat
Atentie la “//” și textul după acesta în exemplele precedente. Acestea sunt comentarii. “//” îi spune compilatorului să ignore textul care urmează în această linie deoarece este inclus pentru ca un om sa ințeleaga mai bine programul, nu face parte din programul în sine. Vom reveni asupra comentariilor mai tarziu.
Initializarea variabilelor
Initializarea variabila demonstreaza un accent pe siguranta C#. Pe scurt, compilatorul C # cere ca orice variabilă să fie inițializată cu o valoare inițială înainte de a vă referi la acea variabilă într-o operație. Majoritatea compilatoarelor moderne vor semnala încălcări ale acestui text ca un avertisment, dar compilatorul C#, care este totdeauna vigilent, tratează astfel de încălcări ca erori. Acest lucru vă împiedică să preluați neintenționat valorile din memorie rămase din alte programe. C# are două metode pentru a se asigura că variabilele sunt inițializate înainte de utilizare:
➤ Variabilele care sunt câmpuri într-o clasă sau structura, dacă nu sunt inițializate în mod explicit, sunt în mod implicit nule, atunci când ele sunt create (clasele și structurile le vom discuta intr-un alt tutorial).
➤ Variabilele care sunt locale unei metode trebuie inițializate în mod explicit în cod înainte de orice declarații în care valorile lor sunt utilizate. În acest caz, inițializarea nu trebuie să seîntâmple când variabila este declarată, dar compilatorul verifică toate căile posibile prin metoda și indică o eroare dacă aceasta detectează orice posibilitate de utilizare a valorii unei variabile locale înainte de a fi inițializată.
De exemplu, nu puteți face următoarele în C#:
public static int Main() { int d; Console.WriteLine(d); // Nu se poate! d nu a fost initializat inainte de folosire return 0; }
Observați că acest fragment de cod demonstrează definirea Main() astfel încât să returneze un int în loc de void. Dacă încercați să compilați liniile precedente, veți primi acest mesaj de eroare:
Use of unassigned local variable 'd'
Luati in considerare urmatoarea afirmatie:
Something objSomething;
În C#, această linie de cod va crea doar o referință pentru un obiect, dar această referință nu se referă la orice obiect. Orice încercare de a apela o metodă sau o proprietate împotriva acestei variabile ar rezulta într-o eroare. Initializarea unui obiect de referință în C# necesită utilizarea noului cuvânt cheie. Creați o referință așa cum este prezentat în exemplul anterior și apoi îndreptați referința la un obiect folosind noul cuvânt cheie:
objSomething = new Something(); // creaza ceva pe o anumita multime
Tipul Inferentelor
Tipul inferentelor utilizează cuvântul cheie var. Sintaxa pentru declararea variabilei se modifică într-o oarecare măsură. Compilatorul “implică” ce tip de variabilă este de la care este inițializată variabila. De exemplu: int someNumber = 0; devine: var someNumber = 0; . Chiar dacă someNumber nu este niciodată declarat ca fiind un int, compilatorul figurează acest lucru și someNumber este un int atâta timp cât este în domeniul de aplicare. Odată compilate, cele două afirmații precedente sunt egale. Iată un scurt program pentru a demonstra:
using System; namespace DEMOPROGRAM { class Program { static void Main(string[] args) { var name = "tutoriale faine"; var age = 26; var isRabbit = true; Type nameType = name.GetType(); Type ageType = age.GetType(); Type isRabbitType = isRabbit.GetType(); Console.WriteLine("name is type " + nameType.ToString()); Console.WriteLine("age is type " + ageType.ToString()); Console.WriteLine("isRabbit is type " + isRabbitType.ToString()); } } }
Rezultatul din acest program este următorul:
name is type System.String age is type System.Int32 isRabbit is type System.Bool
Există câteva reguli pe care trebuie să le urmați:
➤ Variabila trebuie inițializată. În caz contrar, compilatorul nu are nimic din care să deducă tipul.
➤ Initializatorul nu poate fi nul.
➤ Initializatorul trebuie sa fie o expresie.
➤ Nu puteți seta inițializatorul la un obiect decât dacă creați un obiect nou în inițializator.
După ce variabila a fost declarată și tipul dedus, tipul variabilei nu poate fi modificat. Cand este stabilit, tipul variabilei respectă toate regulile pe care trebuie să le urmeze orice alt tip de variabilă.
Domeniul variabilelor
Domeniul de aplicare al unei variabile este regiunea codului din care poate fi accesată variabila. În general, domeniul de aplicare este determinat de următoarele reguli:
➤ Un câmp (cunoscut și ca o variabilă membru) al unei clase este în sfera de aplicare atât timp cât clasa sa conține domeniul de aplicare.
➤ O variabilă locală se află în domeniul de aplicare până când indică sfârșitul instrucțiunii în care a fost declarată.
➤ O variabilă locală declarată într-o declarație for, while sau o afirmație similară este în sfera de aplicare în corpul acelei bucle.
Sfera de concentrare pentru variabilele locale
Este comun într-un program mare să se utilizeze același nume de variabilă pentru variabile diferite în diferite părți ale programului. Acest lucru este bun atâta timp cât variabilele sunt incluse în diferite părți ale programului, astfel încât nu există nicio posibilitate de ambiguitate. Cu toate acestea, rețineți că variabilele locale cu același nume nu pot fi declarate de două ori în același domeniu de aplicare. De exemplu, nu puteți face acest lucru:
int x = 20; // inca o data int x = 30;
Luați în considerare următorul exemplu de cod:
using System; namespace Wrox.ProCSharp.Basics { public class ScopeTest { public static int Main() { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } // i nu mai este aici. // declar inca o variabila i , deoarece // nu există altă variabilă cu acest nume în domeniul de aplicare for (int i = 9; i >= 0; i—-) { Console.WriteLine(i); } // i nu mai este aici. return 0; } } }
Acest cod imprimă pur și simplu numerele de la 0 la 9 și apoi înapoi din nou de la 9 la 0, folosind două bucle for. Important este să notați variabila i de două ori în acest cod, în cadrul aceleiași metode. Puteți face acest lucru pentru că i este declarat în două bucle separate, astfel încât fiecare variabilă i este locală la propria buclă. Iată un alt exemplu:
public static int Main() { int j = 20; for (int i = 0; i < 10; i++) { int j = 30; // Nu se poate face pentru ca j este inca in domeniul de aplicare Console.WriteLine(j + i); } return 0; }
Dacă încercați să compilați acest lucru, veți primi o eroare cum ar fi:
ScopeTest.cs(12,15): error CS0136: A local variable named 'j' cannot be declared in this scope because it would give a different meaning to 'j', which is already used in a 'parent or current' scope to denote something else.
Aceasta se întâmplă deoarece variabila j, care este definită înainte de începerea ciclului for, este încă în domeniul de aplicare în cadrul buclei for și nu va ieși din domeniu până când metoda Main () nu va fi executată. Deși al doilea j (cea ilegală) se află în sfera de acoperire a buclei, acel domeniu de aplicare este în cadrul metodei metodei Main (). Compilatorul nu are nici o modalitate de a face distincția între aceste două variabile, deci nu va permite ca cel de-al doilea să fie declarat.
Domeniile de concentrare pentru câmpuri și variabilele locale
În anumite circumstanțe, totuși, puteți distinge două identificatoare cu același nume (deși nu același nume complet calificat) și același domeniu de aplicare, iar în acest caz compilatorul vă permite să declarați a doua variabilă. Aceasta deoarece C# face o distincție fundamentală între variabilele care sunt declarate la nivel de tip (câmpuri) și variabile care sunt declarate în cadrul metodelor (variabile locale). Luați în considerare următorul fragment de cod:
using System; namespace Wrox { class ScopeTest2 { static int j = 20; public static void Main() { int j = 30; Console.WriteLine(j); return; } } }
Acest cod se va compila chiar dacă aveți două variabile numite j în domeniul de aplicare în cadrul metodei Main (): j care a fost definit la nivelul clasei și nu iese din domeniul de aplicare până când clasa nu este distrusă (atunci când Metoda principală () se termină și programul se termină); și j definit în Main (). În acest caz, noua variabila numită j pe care o declarați în metoda Main () ascunde variabila de nivel de clasă cu același nume, astfel încât atunci când executați acest cod, numărul 30 este afișat. Ce se întâmplă dacă doriți să vă referiți la variabila de nivel de clasă? De fapt, vă puteți referi la câmpurile unei clase sau structuri în afara obiectului, utilizând sintaxa object.fieldname. În exemplul anterior, accesați un static (veți afla ce înseamnă acest lucru în secțiunea următoare) dintr-o metodă statică, astfel încât să nu puteți utiliza o instanță de clasa; folosiți doar numele clasei în sine:
.. public static void Main() { int j = 30; Console.WriteLine(j); Console.WriteLine(ScopeTest2.j); } ..
Dacă accesați un câmp de instanță (un câmp care aparține unei instanțe specifice clasei), veți avea nevoie să utilizați în schimb acest cuvânt cheie.
Constante
După cum sugerează și numele, o constantă este o variabilă a cărei valoare nu poate fi schimbată pe întreaga sa durată “de viata”. Prefixarea unei variabile se realizeaza cu cuvântul cheie const atunci când este declarată și inițializată desemnează acea variabilă ca o constanta:
const int a = 100; // Valoarea nu poate fi modificata
Constantele au următoarele caracteristici:
➤ Acestea trebuie inițializate atunci când sunt declarate; și după ce o valoare a fost atribuită, nu poate fi niciodată suprascrisă.
➤ Valoarea unei constante trebuie să fie calculată la momentul compilării. Prin urmare, nu puteți inițializa o constantă cu o valoare luată dintr-o variabilă. Dacă trebuie să faceți acest lucru, trebuie să utilizați un câmp numai pentru citire.
➤ Constantele sunt întotdeauna implicit statice. Cu toate acestea, observați că nu trebuie să (și, de fapt, nu este permis) includem static în declarația constantă.
Există cel puțin trei avantaje pentru utilizarea constantelor în programele voastre:
➤ Constantele fac programele voastre mai ușor de citit, înlocuind numerele magice și șirurile cu litere ,nume ale căror valori sunt ușor de înțeles.
➤ Constantele fac ca programele voastre să fie mai ușor de modificat. De exemplu, presupuneți că aveți un SalesTax constantă într-unul din programele C#, iar acelei constante i se atribuie o valoare de 6%. Dacă se modifică ulterior rata impozitului pe vânzări, puteți modifica comportamentul tuturor calculelor fiscale pur și simplu prin atribuirea unei noi valori constantei; nu trebuie să vânați codul pentru valoarea .06 și schimbați pe fiecare, sperând că veți găsi toate acestea.
➤ Constantele ajută la prevenirea greșelilor din programele voastre. Dacă încercați să atribuiți o altă valoare constantă undeva în programul tău, altul decât în punctul unde este declarată constanta, compilatorul va semnala eroarea.
Tipuri de date predefinite
Acum că ați văzut cum să declarați variabilele și constantele, să examinăm mai atent tipurile de date disponibile în C#. După ati vazut, C# este mult mai strict în ceea ce privește tipurile disponibile și definițiile acestora decât alte limbaje de programare.
Tabele cu valori
Name | CTS Type | Description | Range (min:max) |
sbyte | System.SByte | 8-bit signed integer | -128:127 |
short | System.Int16 | 16-bit signed integer | -32,768:32,767 |
int | System.Int32 | 32-bit signed integer | -2,147,483,648:2,147,483,647 |
long | System.Int64 | 64-bit signed integer | -9,223,372,036,854,775,808: 9,223,372,036,854,775,807 |
byte | System.Byte | 8-bit unsigned integer | 0:255 |
ushort | System.UInt16 | 16-bit unsigned integer | 0:65,535 |
uint | System.UInt32 | 32-bit unsigned integer | 0:4,294,967,295 |
ulong | System.UInt64 | 64-bit unsigned integer | 0:18,446,744,073,709,551,615 |
Name | CTS Type | Description | Signifiant Figures | Range (Approximate) |
float | System.Single | 32-bit, single-precision floating point |
7 | ±1.5 × 10^245 to ±3.4 × 10^38 |
double | System.Double | 64-bit, double-precision floating point |
15/16 | ±5.0 × 10^2324 to ±1.7 × 10^308 |
Name | CTS Type | Description | Signifiant Figures | Range (Approximate) |
decimal | System.Decimal | 128-bit, high-precision decimal notation |
28 | ±1.0 × 10^228 to ± 7.9 × 10^28 |
Name | CTS Type | Description | Signifiant Figures | Range (Approximate) |
bool | System.Boolean | Represents true or false | NA | true or false |
Name | CTS Type | Values |
char | System.Char | Represents a single 16-bit (Unicode) character |
Escape Sequence | Character |
\’ | Single quotation mark |
\” | Double quotation mark |
\\ | Backslash |
\0 | Null |
\a | Alert |
\b | Backspace |
\f | Form feed |
\n | Newline |
\r | Carriage return |
\t | Tab character |
\v | Vertical tab |
Name | CTS Type | Description |
object | System.Object | The root type. All other types (including value types) in the CTS are derived from object. |
string | System.String | Unicode character string |