عنوان:

‫C# 14.0: معرفی کلیدواژه field


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۲۴ ۰۹:۴۴
آدرس: www.dntips.ir
معرفی ویژگی:
C# 14.0 کلیدواژه زمینه‌ای (contextual keyword) جدیدی به نام field (فیلد) را معرفی می‌کند که پیاده سازی ویژگی‌ها/خواص (properties) را ساده‌تر می کند. این ویژگی در پیش نمایش (preview) NET 10.0. با تنظیم LangVersion (لنگ ورژن) به پیش نمایش (preview) در دسترس است. همچنین در پروژه های NET 9.0. ننیز برای فعال سازی این قابلیت باید کد زیر را در فایل پروژه قرار دهید:
<PropertyGroup>
  <LangVersion>preview</LangVersion>
  ...
</PropertyGroup>
در پروژه های .NET 10.0 هم باید کد فوق را در فایل پروژه قرار دهید.

مشکلات حل شده:
قبلاً، اعمال اعتبار سنجی (validation) در تنظیم کننده‌های ویژگی‌ها (property setters) (به عنوان مثال، محدودیت‌های سنی بر اساس تاریخ تولد) نیاز به فیلدهای پشتیبان (backing fields) صریح داشت. این امر باعث اضافه شدن کد اضافی (boilerplate code) می‌شد. به عنوان مثال در نسخه‌های قدیمی‌تر سی شارپ برای اعمال شرط سن بالای 21 سال برای ویژگی Birthday در کلاس Employee باید کد به این شکل پیاده سازی میشد:
public class Employee
{
    private const int MinAge = 21;

    // Other properties

    private DateOnly _birthday;

    public required DateOnly Birthday
    {
        get => _birthday;
        set
        {
            ArgumentOutOfRangeException.ThrowIfLessThan(value,
                DateOnly.FromDateTime(DateTime.Now.AddYears(-MinAge)));

            _birthday = value;
        }
    }
}

راه حل کلیدواژه field (فیلد):

کلیدواژه field (فیلد) امکان دسترسی مستقیم به فیلد پشتیبان (backing field) را در تنظیم کننده ویژگی (property setter) فراهم می‌کند و نیاز به اعلان فیلدهای پشتیبان (backing fields) صریح را از بین می برد.
مثال: اعتبار سنجی ویژگی Birthday (روز تولد) یک Employee (کارمند) بدون فیلد birthday_ (روز تولد) جداگانه. با استفاده از قابلیت جدید معرفی شده در سی شارپ 14 کد بالا به این شکل قابل پیاده سازی است:
public class Employee
{
    private const int MinAge = 21;

    // Other properties

    public required DateOnly Birthday
    {
        get;
        set
        {
            ArgumentOutOfRangeException.ThrowIfLessThan(value,
                DateOnly.FromDateTime(DateTime.Now.AddYears(-MinAge)));

            field = value;
        }
    }
}

مزایا:
  • کاهش کد اضافی (boilerplate code).
  • پیاده سازی خاصیت‌های (property implementation) تمیزتر.
  • پیاده سازی ساده‌تر تنظیم کننده‌های خاصیت‌ها (property setters) که نیاز به اعتبار سنجی (validation) دارند.


مشاهده مطلب اصلی