تا %60 تخفیف خرید برای 2 نفر با صدور مدرک فقط تا
00 00 00

معرفی قابلیت های جدید سی شارپ 8 (بخش دوم)

حسین احمدی
حسین احمدی
0 پسند
220 بازدید
0 نظر
11 ماه قبل

تعریف reference type های nullable

بوسیله این قابلیت شما دقیقاً مانند تعریف value type های nullable، امکان تعریف reference type های nullable را خواهید داشت. اما شاید این سوال پیش بیاد که تو نسخه های قبلی هم امکان مقداردهی null برای reference type ها وجود داشت، پس چه نیازی به reference type های nullable داریم؟ اینطور میشه که گفت که نحوه رفتار کامپایلر با متغیر های nullable و غیر nullable متفاوت میشه. بهتره این موضوع رو با یک مثال بررسی کنیم.
در قدم اول پروژه ای از نوع کنسول و .NET Core 3 ایجاد می کنیم. فایل csproj رو ویرایش کنید و داخل بخش PropertyGroup مورد زیر رو اضافه کنید:

<Nullable>enable</Nullable>

با این کار به صورت سرتاسری قابلیت Nullable به پروژه شما اضافه میشه. نمونه کد زیر رو در نظر بگیرید:

class Program
{
    static void Main(string[] args)
    {
        Person person = CreatePerson("CO");

        Console.WriteLine(person.Firstname);
    }

    public static Person CreatePerson(string type) => type switch
    {
        "CEO" => new Person() {Type = "Chief Executive Officer"},
        _ => null
    };
}

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Type { get; set; }
}

تو کد بالا در شرایط فعلی هیچ مشکلی نیست و هیچ Warning ای دریافت نمی کنیم. اما کافیه در ابتدای کد ها directive زیر رو اضافه کنیم:

#nullable enable

با اضافه کردن این directive یکسری warning به ما نمایش داده میشه:

امکانات سی شارپ 8

دلیل این موضوع این هست که با اضافه کردن این directive کامپایلر هر جایی که احتمال مقدار null وجود داشته باشه رو به صورت warning به ما نمایش میده. حالا فرض کنید که ما بخواییم خصوصیت Firstname داخل کلاس Person امکان دریافت مقدار null رو داشته باشه. برای اینکار کافیه این خصوصیت رو به صورت nullable تعریف کنیم:

public class Person
{
    public string? Firstname { get; set; }
    public string Lastname { get; set; }
    public string Type { get; set; }
}

یا متد CreatePerson هم همین مشکل وجود داره، کافیه این متد رو به صورت زیر تغییر بدیم تا پیام warning حذف بشه:

public static Person CreatePerson(string type) => type switch
{
    "CEO" => new Person() {Type = "Chief Executive Officer"},
    _ => throw new ArgumentException("Invalid CEO")
};

مبحث nullable reference types خیلی گسترده هست که ما در اینجا توضیح مختصری راجع به این قابلیت دادیم. برای آشنایی بیشتر می تونید این لینک رو مطالعه کنید.

stream های asynchronous

قابلیت جالب بعدی در سی شارپ 8، امکان تعریف Asynchronous Stream هست. برای تعریف متدی که استریم های Asynchronous رو برمیگردونه سه کار باید انجام بدید:

  1. متد باید به صورت async تعریف بشه
  2. مقدار بازگشتی متد باید IAsyncEnumerable باشه
  3. داخل متد باید از yield return استفاده کنید

همچنین زمان استفاده از asynchronous stream باید از عبارت await foreach استفاده کنید. یک مثال ساده می زنیم. متد زیر اعداد 1 تا 100 رو برای ما بر میگردونه:

public static async IAsyncEnumerable<int> CreateList()
{
    for (int counter = 1; counter <= 100; counter++)
    {
        await Task.Delay(100);
        yield return counter;
    }
}

همونطور که شرایط گفته شده در بالا داخل این متد رعایت شده. برای استفاده از این متد به صورت زیر عمل می کنیم:

static async Task Main(string[] args)
{
    await foreach (var number in CreateList())
    {
        Console.WriteLine(number);
    }
}

Indice ها و Range ها

این قابلیت هم خیلی جالبه و کاربردهای زیادی داره. برای استفاده از این قابلیت یک کلاس و یک Struct جدید در دات نت اضافه شده:

  1. System.Index: نمایانگر یک اندیس در لیست هست. علامت مورد استفاده ^ هست که بر اساس عدد انتخابی آیتمی از لیست رو برای برمیگردونه.
  2. System.Range: می توان بوسیله این کلاس متغیری از نوع range تعریف کرد

با فرض اینکه یک آرایه با نام names داریم:

اندیس [0^]names برابر با names[names.Length] هست یا اندیس [1^]names برابر با names[names.Length-1] هست. به طور کل مقداری که بعد از علامت ^ میاد، نشون دهنده n-1 در لیست هست.

لیست زیر رو در نظر بگیرید:

var names = new[]
{
    "Hosein",
    "Ali",
    "Mohammad",
    "Reza",
    "Mehdi",
    "Hassan",
    "Pejman",
    "Akbar",
    "Abbas"
};

حالات مختلف برای استخراج آیتم های لیست رو بررسی می کنیم:

1. استخراج آخرین آیتم از لیست:

Console.WriteLine(names[^1]);

2. استخراج آیتم های 1 تا 3:

foreach (var name in names[1..4])
{
    Console.WriteLine(name);
}

نکته ای که باید بهش توجه کنید این هست که در کد بالا مقدار [4]names شامل آیتم های خروجی نمیشه.

3. استخراج سه آیتم آخر لیست:

foreach (var name in names[^3..^0])
{
    Console.WriteLine(name);
}

کد بالا رو میشه به صورت زیر هم نوشت:

foreach (var name in names[^3..])
{
    Console.WriteLine(name);
}

نوشتن 0^ اختیاری هست.

اما کاربر Range چیست، با مثال زیر متوجه کاربرد این کلاس می شوید:

Range range = ^3..^1;

foreach (var name in names[range])
{
    Console.WriteLine(name);
}

همانطور که می بینید بوسیله Range می توانید متغیری تعریف کرد که شامل محدوده اندیس می باشد.

عملگر انتساب Null-Coalescing

بوسیله این عملگر می توانید عملیات مقدار دهی متغیر را تنها در صورتی انجام داد که مقدارش Null باشد:

string firstname = "Hossein";
string lastname = null;

firstname ??= "Mohammad";
lastname ??= "Ahmadi";

Console.WriteLine($"{firstname} {lastname}");

در کد بالا تنها مقدار lastname تغییر می کند، زیرا مقدار اولیه آن Null است، اما مقدار firstname به دلیل اینکه مقدارش Null نیست، تغییر نمی کند.

نویسنده: حسین احمدی (عضویت در کانال تلگرام)
منبع: وب سایت توسینسو (جزیره برنامه نویسی)
هرگونه نشر و کپی برداری با ذکر نام منبع و نویسنده بلامانع است

نظر شما
برای ارسال نظر باید وارد شوید.
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...