New C# 9 Features Մաս 1 (Հայերեն)
2020-ի վերջին Microsoft-ը ներկայացրեց նոր C# 9.0 : Առաջարկում եմ ծանոթանալ լեզվի մի քանի հետաքրքիր նորություններին:
1. Top-level programs
Պարզագույն ծրագիր գրելու համար, որում ընդամենը պետք էր կոնսոլում տպել որևէ տեքստ՝ C#-ը պահաջում էր գրել համեմատաբար «մեծ» քանակի կոդ՝
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello Armenia!");
}
}
Սա առնվազն անհասկանալի է սկսնակների համար, այժմ այն կարող ենք գրել «պարզ» և «մաքուր» եղանակով:
using System;
Console.WriteLine("Hello World!");
2. Native types
Ավելացվեց nint և nuint նեյթիվ տիպերը: Լեզուն այժմ support է անում համապատասխանաբար native-sized նշանով և առանց նշանի թվային տիպեր: Այս տիպերը System.IntPtr և System.UIntPtr ալիասներն են: Տվյալների այս տեսակը թվային ամբողջ տիպ է, որի չափերը որոշվում է տվյալ համակարգի համապատասխան: 32-բիթանոց համակարգերում այն օգտագործում է System.Int32 , իսկ 64-բիթանոց համակարգերում ` System.Int64:
3. Init-only properties
Ինչպես գիտեք property-ները թույլ են տալիս ճկուն և դյուրընթեռնելի ֆորմատով օբյեկներ ստեղծել: Օրինակ ՝
new Player
{
FirstName = "Leo",
LastName = "Messi",
Number = 10
}
Այսպիսի օբյեկտ ստեղծելու համար անհրաժեշտ է ՝
public class Player
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Number { get; set; }
}
Այսօր ամենամեծ սահմանափակումը կայանում է նրանում, որ property-ները պետք է լինեն mutable, object initializer-ների աշխատելու համար: Դրանք աշխատում են հետևյալ սկզբունքով՝ նախ կանչում են օբյեկտի կոնստրուկտորը, այնուհետև աշխատում է setter-ը:
Init-only property-ները լուծում են այս խնդիրը: Սա իրենից ներկայացնում է init accessor (հանդիսանում է set accessor-ի տեսակ), որը կարող է աշխատել միայն օբյեկտի initialization-ի ժամանակ:
public class Player
{
public string FirstName { get; init; }
public string LastName { get; init; }
public int Number { get; set; }
}
Այսպիսով Player-ի initialization-ից հետ FirstName և LastName property-ները փոփոխել չենք կարող:
4. Init accessors and readonly fields
Քանի որ init accessors կարող են արժեք ստանալ միայն initialization-ի ժամանակ, նրանց թույլ է տրվում փոփոխել readonly field-երը այնպես ինչպես դա կարվեր կոնստրուկտորում:
public class Player
{
private readonly string _firstName;
private readonly string _lastName;public string FirstName
{
get => _firstName;
init => _firstName = (value ??
throw new ArgumentNullException(nameof(FirstName)));
}
public string LastName
{
get => _lastName;
init => _lastName = (value ??
throw new ArgumentNullException(nameof(LastName)));
}
public int Number { get; set; }
}
5. Records
Init-only property-ները հիանալի են, եթե ցանկանում եք կոնկրետ property-ները դարձնել immutable: Եթե ցանկանում եք, որ ամբողջ object-ը immutable լինի և իրեն պահի որպես արժեք, ապա պետք է այն ստեղծել որպես record.
public record Player
{
public string FirstName { get; init; }
public string LastName { get; init; }
public int Number { get; set; }
}