همه چیز در مورد کلمه کلیدی required

👈 کلمه کلیدی required دقیقا چیزیه که شما بهش نیاز دارید تا کد تمیزتری بنویسید.


👁 بازدید : 96

1402/12/24 | 19:5 : تاریخ 📆


 یکی از کلمات کلیدی یا به اصطلاح keywordهایی که در سیشارپ نسخه 11 اضافه شد کلمه کلیدی required بود.قضیه ایجوری بود که کلاس ممبر(class member)های ما وقتی تعریف میشدن در هنگام استفاده و مقداردهی ممکن بود بعضیشون فراموش بشن و شاید به خاطر تعدد پراپرتی ها تضمینی برای مقدار دهی براشون وجود نداشت، اما اگر شما هم مثل من از این مشکلات باتون پیش میومد، فقط کافیه از کلمه کلیدی required استفاده کنید.required این تضمین رو به شما میده که حتما پراپرتی شما مقدار دهی میشه و اگر هم یادتون بره کامپایلر خطا نشون میده.

قبل از required :

- کانستراکتورِ جان

خب قبلا ما اگر میخواستیم تضمینی برای پر کردن یک (یا چند) پراپرتی داشته باشیم کافی بود از کانستراکتور استفاده میکردیم و در ورودی کلاس مقدار میدادیم:

public class MyClass
{
    public string RequiredString { get; set; }

    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

روش بالا تضمین مقداردهی پراپرتی رو بهمون میده اما مشکلی که برامون ایجاد میکنه وقتی که میخواهیم نمونه سازی کنیم از کلاس. در این صورت با هر با نمونه سازی باید یک مقدار استرینک به عنوان پارامتر کلاس بهش علام کنیم.

حین و بعد از required :

- کانستراکتورِ دیفالت

حالا بزارید کلاس بالا رو با اصلاح کننده(modifier) required بنویسیم:

public class MyClass
{
    public required string RequiredString { get; set; }
}

در این صورت دیگه نیازی به کانستراکتور نداریم و وقتی از کلاس نمونه سازی کنیم کامپایلر ما را مجبور می کند که به پراپرتی مقدار بدیم.علاوه بر این، حتی اگر ما هرگز پراپرتی را  مقدار دهی نکنیم، هشدار پراپرتی غیر قابل نال(non-nullable) را دریافت نمی کنیم. این به این دلیل است که کامپایلر میدونه که امکان ایجاد نمونه ای از این کلاس بدون مقداردهی پراپرتی وجود ندارد.

var myClass = new MyClass() { RequiredString = "Hello World" };

 

یک ترکیب سمی : 

حالا بیایید دو مثال بالا رو با هم ترکیب کنیم :

public class MyClass
{
    public required string RequiredString { get; set; }

    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

حالا ما یک پراپرتی داریم که required و یک کانستراکتور داریم که هنگام نمونه سازی از کلاس باید یک پارامتر به کلاس بدیم.(یک ترکیب کاملا سمی)

var myClass = new MyClass("Hello World"){RequiredString="Hello World"};

برای اینکه از ماتریکس این سم خارج بشیم میتونیم از اتربیوت [SetsRequiredMembersAttribute] در فضای نام System.Diagnostics.CodeAnalysis استفاده کنیم.

public class MyClass
{
    public required string RequiredString { get; set; }

    [SetsRequiredMembersAttribute]
    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

دراینصورت کانستراکتور این تضمین رو به کامپایلر میده که مقدار پارامتر وردودی کلاس در هنگام نمونه سازی رو به پراپرتی اختصاص بده.

var myClass = new MyClass("Hello World";

اما لازمه بدونید که در مثال بالا اگر شما چندین پراپرتی داشته باشید کامپایلر متوجه نمیشه که آیا تمام پراپرتی های شما داخل کانستراکتور set شده اند یا خیر.پس یادتون نره زحمت این کار رو برای دونه دونه پراپرتی ها باید بکشید.

نتیجه گیری
امکان تعریف اعضای required در سی شارپ یک ویژگی جدید و مفیده که به ما کمک می کنه کد ایمن تر با خطوط کمتر بنویسیم. این یک ویژگی قدرتمنده که می تونه قابلیت اطمینان کد ما را به طور قابل توجهی بهبود بده. این مورد در هنگام کار با مدل های و مدل سازی(ORM یا اتصال به دیتابیس) بیشتر به چشم میخوره.

 یکی از کلمات کلیدی یا به اصطلاح keywordهایی که در سیشارپ نسخه 11 اضافه شد کلمه کلیدی required بود.قضیه ایجوری بود که کلاس ممبر(class member)های ما وقتی تعریف میشدن در هنگام استفاده و مقداردهی ممکن بود بعضیشون فراموش بشن و شاید به خاطر تعدد پراپرتی ها تضمینی برای مقدار دهی براشون وجود نداشت، اما اگر شما هم مثل من از این مشکلات باتون پیش میومد، فقط کافیه از کلمه کلیدی required استفاده کنید.required این تضمین رو به شما میده که حتما پراپرتی شما مقدار دهی میشه و اگر هم یادتون بره کامپایلر خطا نشون میده.

قبل از required :

- کانستراکتورِ جان

خب قبلا ما اگر میخواستیم تضمینی برای پر کردن یک (یا چند) پراپرتی داشته باشیم کافی بود از کانستراکتور استفاده میکردیم و در ورودی کلاس مقدار میدادیم:

public class MyClass
{
    public string RequiredString { get; set; }

    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

روش بالا تضمین مقداردهی پراپرتی رو بهمون میده اما مشکلی که برامون ایجاد میکنه وقتی که میخواهیم نمونه سازی کنیم از کلاس. در این صورت با هر با نمونه سازی باید یک مقدار استرینک به عنوان پارامتر کلاس بهش علام کنیم.

حین و بعد از required :

- کانستراکتورِ دیفالت

حالا بزارید کلاس بالا رو با اصلاح کننده(modifier) required بنویسیم:

public class MyClass
{
    public required string RequiredString { get; set; }
}

در این صورت دیگه نیازی به کانستراکتور نداریم و وقتی از کلاس نمونه سازی کنیم کامپایلر ما را مجبور می کند که به پراپرتی مقدار بدیم.علاوه بر این، حتی اگر ما هرگز پراپرتی را  مقدار دهی نکنیم، هشدار پراپرتی غیر قابل نال(non-nullable) را دریافت نمی کنیم. این به این دلیل است که کامپایلر میدونه که امکان ایجاد نمونه ای از این کلاس بدون مقداردهی پراپرتی وجود ندارد.

var myClass = new MyClass() { RequiredString = "Hello World" };

 

یک ترکیب سمی : 

حالا بیایید دو مثال بالا رو با هم ترکیب کنیم :

public class MyClass
{
    public required string RequiredString { get; set; }

    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

حالا ما یک پراپرتی داریم که required و یک کانستراکتور داریم که هنگام نمونه سازی از کلاس باید یک پارامتر به کلاس بدیم.(یک ترکیب کاملا سمی)

var myClass = new MyClass("Hello World"){RequiredString="Hello World"};

برای اینکه از ماتریکس این سم خارج بشیم میتونیم از اتربیوت [SetsRequiredMembersAttribute] در فضای نام System.Diagnostics.CodeAnalysis استفاده کنیم.

public class MyClass
{
    public required string RequiredString { get; set; }

    [SetsRequiredMembersAttribute]
    public MyClass(string requiredString)
    {
        RequiredString = requiredString;
    }
}

دراینصورت کانستراکتور این تضمین رو به کامپایلر میده که مقدار پارامتر وردودی کلاس در هنگام نمونه سازی رو به پراپرتی اختصاص بده.

var myClass = new MyClass("Hello World";

اما لازمه بدونید که در مثال بالا اگر شما چندین پراپرتی داشته باشید کامپایلر متوجه نمیشه که آیا تمام پراپرتی های شما داخل کانستراکتور set شده اند یا خیر.پس یادتون نره زحمت این کار رو برای دونه دونه پراپرتی ها باید بکشید.

نتیجه گیری
امکان تعریف اعضای required در سی شارپ یک ویژگی جدید و مفیده که به ما کمک می کنه کد ایمن تر با خطوط کمتر بنویسیم. این یک ویژگی قدرتمنده که می تونه قابلیت اطمینان کد ما را به طور قابل توجهی بهبود بده. این مورد در هنگام کار با مدل های و مدل سازی(ORM یا اتصال به دیتابیس) بیشتر به چشم میخوره.

هنوز دیدگاهی ثبت نشده

تمامی‌حقوق‌مادی‌ومعنوی‌این‌سایت‌برای‌یادمیگیریم‌محفوظ است.