hamed hajiloo
hamed hajiloo
خواندن ۲ دقیقه·۲ سال پیش

ویژگی Required، روشی برای مشکلات فعال بودن Nullable

اگر ویژگی nullable reference types را فعال کرده باشید، هنگام تعریف متغییر‌ها یا property هایی از نوع reference types، حتما باید مشخص کنید که آیا متغییر‌های شما nullable reference type هستند یا خیر.

اگر متغییر ما از نوع nullable باشد، مشکلی وجود ندارد و با چالشی که قرار است در مورد آن صحبت کنیم مواجه نمی‌شویم.

Nullable string in C#
Nullable string in C#

اما اگر همین متغییر nullable نبود، شما مجبور بودید به یک نحوی مقدار اولیه را در هر شرایطی به این متغییر بدهید.

راه حل اول: استفاده از مقدار پیشفرض برای property

Default value for properties
Default value for properties

ولی این راه حل یک راه حل جامع نیست. راه حل جامع و همه گیر، استفاده از سازنده کلاس است.

Set value of properties in constructor
Set value of properties in constructor

راه حل دوم راه حل درستی است ولی شما همه property ها را باید در سازنده کلاس initialize کنید. در این حالت شما هر موقع قصد داشتید از کلاس Person استفاده کنید مجبور هستید از این constructor استفاده کنید.



راه حل پیشنهادی Microsoft در C# 11

راه حل رهایی از این مشکلات، استفاده از کلمه کلیدی required است.

Required property
Required property

در این حالت اگر جایی بخواهیم از کلاس Teacher یک نمونه بگیریم، حتما باید به صورت object initializer از آن استفاده کنیم و مقدار Name را به آن بدهیم، در غیر اینصورت با خطای زیر مواجه میشویم.

Required member must be set in the object initializer
Required member must be set in the object initializer

و بدین شکل خطا از بین می‌رود.

Set required property in object initializer
Set required property in object initializer



بررسی ویژگی SetsRequiredMembers

در مثال بالا اگر شما یک سازنده داشته باشید و بخواهید از طریق آن مقدار Name را پر کنید چه اتفاقی رخ می‌دهد؟

Required member must be set in the object initializer
Required member must be set in the object initializer

باز هم با همان خطای قبلی مواجه می‌شویم!

برای حل این مشکل میتوان از اتربیوت SetsRequiredMembers بالای سازنده (مورد نظر) خود استفاده کرد.

SetsRequiredMembers
SetsRequiredMembers



سورس کد


csharpdotnetdotnet7csharp11required
حامد حاجیلو هستم، یک NET Full Stack Developer.
شاید از این پست‌ها خوشتان بیاید