Tipuri și variabile C#

Tradus din această pagină oficială de documentație Microsoft.

Există două feluri de tipuri în C#: tipuri valoare și tipuri referință. Variabilele de tipuri valoare își conțin datele direct în timp ce variabilele de tipuri referință stochează referințe către datele lor, cel din urmă fiind cunoscut ca obiecte. Cu tipuri referință, este posibil ca două variabile să se refere la același obiect și deci posibil ca operațiile asupra unei variabile să afecteze obiectul referit de cealaltă variabilă. Cu tipurile valori, variabilele fiecare au propria lor copie a datelor, și nu este posibil ca operațiile asupra uneia să afecteze alta (excepție făcând cazul variabilelor parametri ref și out).

Tipurile valoare C# sunt mai departe împărțite în tipuri simple, tipuri enum, tipuri struct, și tipuri valoare nulabile. Tipurile referință ale C# sunt mai departe împărțite în tipuri clasă, tipuri interfață, tipuri tablou (en. array), și tipuri delegat.

Cele ce urmează oferă o vedere de ansamblu a sistemului de tipuri al C#.
  • Tipuri valoare
    • Tipuri simple
      • întregi cu semn: sbyte, short, int, long
      • întregi fără semn: byte, ushort, uint, ulong
      • caractere Unicode: char
      • virgulă mobilă IEEE: float, double
      • decimal cu precizie înaltă: decimal
      • boolean: bool
    • Tipuri enum
      • Tipuri definite de utilizator de forma enum E {...}
    • Tipuri struct
      • Tipuri definite de utilizator de forma struct S {...}
    • Tipuri valoare nulabile
      • Extensii ale tuturor celorlalte tipuri valoare cu o valoare null
  • Tipuri referință
    • Tipuri clasă
      • Clasa primordială de bază a tuturor celorlalte tipuri: object
      • Siruri Unicode: string
      • Tipuri definite de utilizator de forma class C {...}
    • Tipuri interfață
      • Tipuri definite de utilizator de forma interface I {...}
    • Tipuri tablou
      • Uni- și multi-dimensional, de exemplu, int[] și int[,]
    • Tipuri delegat
      • Tipuri definite de utilizator de forma delegate int D(...)
Cele opt tipuri întregi oferă suport pentru valori de 8, 16, 32, și 64 de biți în formă cu semn sau fără semn.

Cele două tipuri în virgulă mobilă, float și double, sunt reprezentate folosind formatele IEC-60559 de precizie simplă (32 de biți) și, respectiv, precizie dublă (64 de biți).

Tipul decimal este un tip de date de 128 de biți potrivit pentru calcule financiare și monetare.

Tipul bool al C# este folosit pentru a reprezenta valori Booleane — valori care sunt fie true fie false.

Procesarea de caractere și șiruri în C# folosește codificarea Unicode. Tipul char reprezintă o unitate de cod UTF-16, și tipul string reprezintă o secvență de unități de cod UTF-16.

Aceasta sumarizează tipurile numerice ale C#.
  • Intregi cu semn
    • sbyte: 8 biți, interval de la -128 - 127
    • short: 16 biți, interval de la -32,768 - 32,767
    • int: 32 biți, interval de la -2,147,483,648 - 2,147,483,647
    • long: 64 biți, interval de la –9,223,372,036,854,775,808 la 9,223,372,036,854,775,807
  • Intregi fără semn
    • byte: 8 biți, interval de la 0 - 255
    • ushort: 16 biți, interval de la 0 - 65,535
    • uint: 32 biți, interval de la 0 la 4,294,967,295
    • ulong: 64 biți, interval de la 0 la 18,446,744,073,709,551,615
  • Virgulă mobilă
    • float: 32 biți, interval de la 1.5 × 10−45 - 3.4 × 1038, precizie de 7 cifre
    • double: 64 de biți, interval de la 5.0 × 10−324 - 1.7 × 10308, precizie de 15 cifre
  • Decimal
    • decimal: 128 biți, intervalul este cel puțin –7.9 × 10−28 - 7.9 × 1028, cu precizie de cel puțin 28 de cifre
Programele C# folosesc declarații de tip pentru a crea noi tipuri. O declarație de tip specifică numele și membrii noului tip. Cinci din categoriile de tipuri ale C# sunt tipuri definibile de utilizator: tipuri clasă, tipuri struct, tipuri interfață, tipuri enum, și tipuri delegat.

Un tip class definește o structură de date care conține membri date (câmpuri) și membrii funcții (metode, proprietăți, și altele). Tipurile clasă suportă moștenire singulară și polimorfism, mecanisme prin care clasele derivate pot extinde și specializa clase bază.

Un tip struct este similar cu un tip clasă în faptul că el reprezintă o structură cu membri date și membri funcții. Totuși, spre deosebire de clase, structurile sunt tipuri valoare și nu cer în mod obișnuit alocare pe heap. Tipurile structură nu suportă moștenire specificată de utilizator, și toate tipurile struct moștenesc implicit de la tipul object.
Un tip interface definește un contract ca o mulțime numită de membri funcții publici. O class sau o struct care implementează o interface trebuie să furnizeze implementări ale membrilor funcții ale interfeței. O interface poate moșteni de la multiple interfețe bază, și o class sau o struct pot implementa multiple interfețe.

Un tip delegate reprezintă referințe la metode cu o listă de parametri și tip de întoarcere particulare. Delegații fac posibilă tratarea metodelor ca entități care pot fi atribuite la variabile și transmise c parametri. Delegații sunt analogi cu tipurile funcții oferite de limbajele funcționale. Ele sunt de asemenea similare cu conceptul de pointeri de funcții găsit în câteva alte limbaje, dar spre deosebire de pointeri la funcții, delegații sunt orientați pe obiecte și tipuri sigure.

Tipurile class, struct, interface și delegate toate suportă programare generică, prin care pot fi parametrizate cu alte tipuri.

Un tip enum este un tip distinct cu constante numite. Oricare tip enum are un tip la bază, care trebuie să fie unul dintre cele opt tipuri întregi. Mulțimea de valori ale unui tip enum este aceeași ca mulțimea de valori a tipului de bază.

C# suportă tablouri uni- și multi-dimensionale de orice tip. Spre deosebire de tipurile listate mai sus, tipurile tablou nu trebuie să fie declarate înainte de a putea fi folosite. In schimb, tipurile tablou sunt construite prin urmarea unui nume de tip cu paranteze drepte. De exemplu, int[] este un tablou uni-dimensional de int, int[,] este un tablou bi-dimensional de int, și int[][] este un tablou uni-dimensional de tablouri uni-dimensionale de int.

Tipurile valori nulabile de asemenea nu trebuie să fie declarate înainte de a putea fi folosite. Pentru fiecare tip valoare non-nulabil T există un tip valoare nulabil T?, care poate reține o valoare în plus, null. De exemplu, int? este un tip care poate conține orice întreg de 32 de biți sau valoarea null.

Sistemul de tipuri al C# este unificat în așa fel încât o valoare de oricare tip poate fi tratată ca un object. Oricare tip din C# derivă direct sau indirect din tipul clasă object, și object este clasa bază finală a tuturor tipurilor. Valorile de tipuri referință sunt tratate ca obiecte pur și simplu prin vederea valorilor ca tip object. Valorile de tipuri valoare sunt tratate ca obiecte realizând operațiile boxing și unboxing. In următorul exemplu, o valoare int este convertită la object și înapoi din nou la int.

using System;
class BoxingExample
{
    static void Main()
    {
        int i = 123;
        object o = i;    // Boxing
        int j = (int)o;  // Unboxing
    }
}


Când valoarea unui tip valoare este convertită la tipul object, o instanță object, de asemenea numită o „cutie” (en. box), este alocată pentru a reține valoarea, și valoarea este copiată în acea cutie. Invers, când o referință object este convertită la un tip valoare, o verificare este făcută ca object-ul referit să fie o cutie a tipului valoare corect, și, dacă verificarea reușește, valoarea din cutie este copiată în afară.

Sistemul unificat de tipuri al C# înseamnă efectiv că tipurile valoare pot deveni obiecte „la cerere”. Datorită unificării, bibliotecile cu scop general care folosesc tipul object pot fi folosite și cu tipuri referință și cu tipuri valoare.

Există câteva feluri de variabile în C#, inclusiv câmpuri, elemente de tablouri, variabile locale, și parametri. Variabilele reprezintă locații de stocare, și fiecare variabilă are un tip care determină ce valori pot fi stocate în variabilă, după cum se arată dedesubt.
  • Tip valoare non-nulabil
    • O valoare a exact acelui tip
  • Tip valoare nulabil
    • O valoare null sau o valoare a exact acelui tip
  • object
    • O referință null, o referință la un obiect de oricare tip referință, sau o referință la o valoare boxed de oricare tip valoare
  • Tip clasă
    • O referință null, o referință la o instanță a acelui tip clasă, sau o referință la o instanță a unei clase derivate din acel tip clasă
  • Tip interfață
    • O referință null, o referință la o instanță a unui tip clasă care implementează acel tip interfață, sau o referință la o valoare boxed a unui tip valoare care implementează acel tip interfață
  • Tip tablou (en. array)
    • O referință null, o referință la o instanță a acelui tip tablou, sau o referință la o instanță a unui tip tablou compatibil
  • Tip delegat
    • O referință null sau o referință la o instanță a unui tip delegat compatibil

Tradus din această pagină oficială de documentație Microsoft.

Niciun comentariu:

Trimiteți un comentariu