یکی از جالب ترین ویژگی های C# 11 که با Visual Studio 2022 17.3 معرفی شد، اصلاح کننده required است. اصلاح کننده required ، استفاده کننده از این کد را مجبور می کند که مقداری را وارد کند.
اصلاحکننده required ، کد مصرفکننده را برای مقداردهی اولیه فیلدها/ویژگیها یا از طریق سازندهها (زمانی که سازنده با SetsRequiredMembersAttribute مشخص شده باشد) یا هنگام مقدار دهی اولیه یک شی از یک نوع استفاده می شود.
وقتی میخواهید مطمئن شوید که توسعه دهندگانی که از کلاس شما استفاده می کنند ، فیلدها یا ویژگیهای اجباری را مقداردهی اولیه میکنند، بسیار مفید هستند.
به تکه کد توجه کنید :
public class Foo{
public required string Name{ get; init; }
}
اصلاحکننده required برای ویژگی Name تضمین میکند که کلاینت باید ویژگی را هنگام ایجاد یک نمونه از Foo مقداردهی اولیه کند. اگر بخواهید یک نمونه از کلاس Foo را بدون مقداردهی اولیه ویژگی Name ایجاد کنید، کامپایلر به شما خطا می دهد.
var foo = new Foo();
// Compile Error
// Error CS9035 Required member 'Foo.Name' must be set in the object initializer or attribute constructor. RequiredMembers (net7.0)
در غیاب سازنده بدون SetsRequiredMembersAttribute (در ادامه باهاش آشنا می شید)، استفاده کننده از کلاس مورد نظر باید از مقداردهی اولیه شی استفاده کند. کد زیر یک کد معتبر است.
var foo = new Foo() { Name = "John Doe" };
SetsRequiredMembersAttribute به توسعه دهندگان اجازه می دهد تا سازنده ها را علامت گذاری کنند که تمام اعضای مورد نیاز را مقداردهی اولیه می کند. کد زیر را در نظر بگیرید.
public class Bar{
[SetsRequiredMembers]
public Bar() => Name = String.Empty;
public Bar(string name) => Name = name;
public required string Name{ get; set; }
}
کلاس Bar دارای یک ویژگی Name است که با اصلاح کننده required مشخص شده است. همچنین دارای دو سازنده است - یک سازنده بدون پارامتر و یک سازنده که یک پارامتر را می پذیرد.
در مثال بالا، سازنده بدون پارامتر با SetsRequiredMembersAttribute مشخص شده است. این Attribute به کامپایلر می گوید که اگر مصرف کننده کد ما ، نمونه شی را با استفاده از سازنده خاص مقداردهی اولیه کند، آنگاه می تواند با خیال راحت فرض کند که تمام خصوصیات مورد نیاز در کلاس مقداردهی اولیه شده اند و نیازی به مقداردهی اولیه خصوصیات با استفاده از مقداردهی اولیه شی نیست.
// Following compiles
var bar = new Bar();
از طرف دیگر، در کد بالا، سازنده ای که یک پارامتر واحد را می پذیرد با SetsRequiredMembersAttribute مشخص نشده است. در نتیجه، اگر کد مصرف کننده از سازنده مذکور برای مقداردهی اولیه اشیاء استفاده کند، بدون اینکه مشخصاً خصوصیات را با استفاده از نمونه سازی اولیه مقداردهی کند، کامپایلر خطا خواهد داشت.
var bar = new Bar("John Doe");
// Compiler throws following error
// Error CS9035 Required member 'Bar.Name' must be set in the object initializer or attribute constructor. RequiredMembers (net7.0)
اگر کلاس Bar را مشاهده کنید، سازنده ای که یک پارامتر دریافت میکند، در واقع عضو مورد نیاز را مقداردهی اولیه می کند. با این حال، به دلیل عدم وجود SetsRequiredMembersAttribute، کامپایلر نمی تواند تشخیص دهد که سازنده با موفقیت تمام اعضای مورد نیاز را مقداردهی اولیه کرده است.