MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Dynamic Language Runtime (DLR) în C#. Cuvântul cheie dynamic

Deși C# este un limbaj de programare cu tipizare statică, în versiunile recente ale limbajului au fost adăugate anumite capabilități dinamice. Astfel, începând cu .NET 4.0, a fost introdusă o nouă funcționalitate denumită DLR (Dynamic Language Runtime). DLR reprezintă un mediu de execuție pentru limbajele dinamice, cum ar fi IronPython și IronRuby.

Pentru a înțelege importanța acestei noutăți, este esențial să conștientizăm diferența dintre limbajele cu tipizare statică și dinamică. În limbajele cu tipizare statică, identificarea tuturor tipurilor și membrilor acestora – proprietăți și metode – are loc în timpul compilării. În schimb, în limbajele dinamice, sistemul nu știe nimic despre proprietățile și metodele tipurilor până la execuție.

Datorită mediului DLR, C# poate crea obiecte dinamice, ale căror membri sunt identificați în timpul execuției programului, și le poate utiliza împreună cu obiectele tradiționale cu tipizare statică.

Un aspect cheie al utilizării DLR în C# este aplicarea tipurilor dynamic. Acest cuvânt cheie permite omisiunea verificării tipurilor în timpul compilării. În plus, obiectele declarate ca dynamic pot schimba tipul lor pe parcursul execuției programului. De exemplu:

dynamic obj = 3;            // aici obj este un int
Console.WriteLine(obj);     // 3

obj = "Hello world";        // obj devine un string
Console.WriteLine(obj);     // Hello world

obj = new Person("Tom", 37); // obj devine un obiect Person
Console.WriteLine(obj);      // Person { Name = Tom, Age = 37 }

record class Person(string Name, int Age);

Chiar dacă variabila obj își schimbă tipul de mai multe ori, acest cod va funcționa corect. Utilizarea tipurilor dynamic diferă de utilizarea cuvântului cheie var. Pentru o variabilă declarată cu var, tipul este dedus în timpul compilării și nu se mai schimbă pe parcursul execuției.

Există asemănări între utilizarea dynamic și tipul object. Dacă în exemplul anterior am înlocui dynamic cu object (object obj = 3;), rezultatul ar fi același. Totuși, există diferențe. De exemplu:

object obj = 24;
dynamic dyn = 24;
obj += 4; // aceasta nu este permisă
dyn += 4; // aceasta este permisă

În linia obj += 4;, apare o eroare, deoarece operația += nu poate fi aplicată la tipurile object și int. Cu o variabilă declarată ca dynamic, acest lucru va funcționa, deoarece tipul său va fi cunoscut doar în timpul execuției.

O altă caracteristică distinctivă a utilizării dynamic este că acest cuvânt cheie poate fi aplicat nu doar variabilelor, ci și proprietăților și metodelor. De exemplu:

class Person
{
   public string Name { get; }
   public dynamic Age { get; set; }
   public Person(string name, dynamic age)
   {
       Name = name; Age = age;
   }

   // afișăm salariul în funcție de formatul specificat
   public dynamic GetSalary(dynamic value, string format)
   {
       if (format == "string") return $"{value} euro";
       else if (format == "int") return value;
       else return 0.0;
   }

   public override string ToString() => $"Name: {Name}  Age: {Age}";
}

În clasa Person este definită o proprietate dinamică Age, astfel încât la atribuirea unei valori acestei proprietăți putem scrie fie person.Age=22, fie person.Age="twenty-two". Ambele variante sunt valabile. De asemenea, prin parametrul age din constructor, putem atribui orice valoare acestei proprietăți.

Există, de asemenea, o metodă GetSalary, care returnează o valoare dynamic. De exemplu, în funcție de parametru, putem returna fie o reprezentare text a sumei veniturilor, fie o valoare numerică. De asemenea, metoda acceptă un parametru dynamic. Astfel, putem transmite ca valoare a venitului fie un număr întreg, fie unul zecimal sau chiar un șir de caractere. Iată un exemplu concret:

dynamic tom = new Person("Tom", 22);
Console.WriteLine(tom);
Console.WriteLine(tom.GetSalary(28, "int"));

dynamic bob = new Person("Bob", "twenty-two");
Console.WriteLine(bob);
Console.WriteLine(bob.GetSalary("twenty-eight", "string"));

Ieșirea în consolă:

Name: Tom  Age: 22
28
Name: Bob  Age: twenty-two
twenty-eight euro

Acest exemplu arată cum tipul dynamic permite flexibilitatea tipurilor de date în timpul execuției, făcându-l util în scenarii unde tipizarea strictă ar limita funcționalitatea.

← Lecția anterioară Lecția următoare →