New C# 9 Features Մաս 1 (Հայերեն)

Vanik Hakobyan
2 min readJan 22, 2021

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

Այսպիսով Playerinitialization-ից հետ 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: Եթե ցանկանում եք, որ ամբողջ objectimmutable լինի և իրեն պահի որպես արժեք, ապա պետք է այն ստեղծել որպես record.

public record Player
{
public string FirstName { get; init; }
public string LastName { get; init; }
public int Number { get; set; }
}

--

--