πŸ–₯ Dynamic Language Runtime

DLR Π² C#. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово dynamic



Π₯отя C# относится ΠΊ статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языкам, Π² послСдних вСрсиях языка Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ динамичСскиС возмоТности. Π’Π°ΠΊ, начиная с .NET 4.0 Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° новая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ DLR (Dynamic Language Runtime). DLR прСдставляСт срСду выполнСния динамичСских языков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΡ… языков ΠΊΠ°ΠΊ IronPython ΠΈ IronRuby.



Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ языками со статичСской ΠΈ динамичСской Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ†ΠΈΠ΅ΠΉ. Π’ языках со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ выявлСниС всСх Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ² - свойств ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² происходит Π½Π° этапС компиляции. А Π² динамичСских языках систСмС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ извСстно ΠΎ свойствах ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ выполнСния.



Благодаря этой срСдС DLR C# ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ динамичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π° этапС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСстС с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.



ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ использования DLR Π² C# являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² dynamic. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово позволяСт ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя компиляции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ dynamic, ΠΌΠΎΠ³ΡƒΡ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ свой Ρ‚ΠΈΠΏ. НапримСр:





dynamic obj = 3; // здСсь obj - цСлочислСнноС int

Console.WriteLine(obj); // 3



obj = "Hello world"; // obj - строка

Console.WriteLine(obj); // Hello world



obj = new Person("Tom", 37); // obj - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Person

Console.WriteLine(obj); // Person { Name = Tom, Age = 37 }




record class Person(string Name, int Age);

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная x мСняСт Ρ‚ΠΈΠΏ своСго значСния нСсколько Ρ€Π°Π·, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π’ этом использованиС Ρ‚ΠΈΠΏΠΎΠ² dynamic отличаСтся ΠΎΡ‚ примСнСния ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова var. Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, объявлСнной с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова var, Ρ‚ΠΈΠΏ выводится Π²ΠΎ врСмя компиляции ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎ врСмя выполнСния большС Π½Π΅ мСняСтся.



Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм dynamic ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ object. Если Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ dynamic Π½Π° object: object x = 3;, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅. Однако ΠΈ Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ различия. НапримСр:



object obj = 24;

dynamic dyn = 24;

obj += 4; // Ρ‚Π°ΠΊ нСльзя

dyn += 4; // Π° Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ


На строкС obj += 4; ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ опСрация += Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ object ΠΈ int. Π‘ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, объявлСнной ΠΊΠ°ΠΊ dynamic, это ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π΅ Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ извСстСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния.



Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ использования dynamic состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово примСняСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π½ΠΎ ΠΈ ΠΊ свойствам ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ. НапримСр:



class Person

{

public string Name { get;}

public dynamic Age { get; set; }

public Person(string name, dynamic age)

{

Name = name; Age = age;

}



// Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Ρƒ Π² зависимости ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°

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}";

}


Π’ классС Person ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ динамичСскоС свойство Age, поэтому ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ значСния этому свойству ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ person.Age=22, ΠΈ person.Age="twenty-two". Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ допустимыми. А Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ age Π² конструкторС этому свойству ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.



Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ GetSalary, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ dynamic. НапримСр, Π² зависимости ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ»ΠΈ строковоС прСдставлСниС суммы Π΄ΠΎΡ…ΠΎΠ΄Π° ΠΈΠ»ΠΈ числСнноС. Π’Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ dynamic Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² качСствС значСния Π΄ΠΎΡ…ΠΎΠ΄Π° ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΈ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ число ΠΈΠ»ΠΈ строку. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅:



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"));




ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:



Name: Tom Age: 22

28

Name: Bob Age: twenty-two

twenty-eight euro




@csharp_ci