سازنده های اولیه در C# 12 می توانند در کلاس ها و ساختارها و همچنین انواع رکورد استفاده شوند. در اینجا نحوه کد شما را تمیزتر و مختصرتر می کنند.
یکی از ویژگی های جدید قابل توجه در C# 12 پشتیبانی از سازنده های اولیه است. مفهوم سازنده های اولیه جدید نیست. چندین زبان برنامه نویسی از جمله Scala، Kotlin، و OCaml برای ادغام پارامترهای سازنده مستقیماً در محلی که کلاس خود را اعلام می کنید، پشتیبانی می کنند.
در این مقاله، ما نگاهی دقیق به سازنده های اولیه و نحوه کار با آنها در C# 12 خواهیم داشت. برای اجرای نمونه های کد ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک برنامه جدید کنسول NET Core دنبال کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 8.0 (Long Term Support)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کاربردی کنسول NET 8 برای کار با سازنده های اصلی در بخش های بعدی این مقاله استفاده خواهیم کرد.
سازنده های اولیه چیست؟
سازندههای اولیه شما را قادر میسازد که سازندهها را در یک کلاس یا یک ساختار با پارامترهای موجود در سرتاسر بدنه نوع تعریف کنید. با استفاده از سازنده های اولیه، می توانید سازنده هایی برای کلاس یا ساختار خود بدون نوشتن کد ایجاد کنید. بدون اعلان صریح اعضای داده خصوصی و اجرای سازندگان برای تخصیص مقادیر پارامترهای سازنده به آن اعضای داده.
قطعه کد زیر یک سازنده اولیه اعلام شده در داخل یک ساختار را نشان می دهد.
public readonly struct Rectangle(double x, double y) { //Members of the struct Rectangle }
در زیر یک پیاده سازی ساده از یک سازنده اولیه که در داخل یک کلاس اعلام شده است.
است
public class Rectangle(double x, double y) { //Members of the class Rectangle }
پارامترهای سازنده اولیه در کل کلاس در نظر گرفته شده است. آنها برای همه اعضای نمونه به جز سازنده های ثانویه قابل دسترسی هستند. در سی شارپ، کامپایلر استنباط میکند که به کدام فیلدهای خصوصی نیاز داریم و مقادیر مربوطه را میگیرد.
تکه کد زیر را در نظر بگیرید که سازنده اصلی را برای کلاسی به نام Customer پیاده سازی می کند.
public class Customer(int id, string FirstName, string LastName) { //Implement the class members here }
ویژگی های مربوط به این کلاس به طور خودکار با استفاده از پارامترهای سازنده اصلی مقداردهی اولیه می شوند.
مزایا و معایب سازنده های اولیه در سی شارپ
سازنده های اولیه در سی شارپ سه مزیت کلیدی را ارائه می دهند.
- نحو ساده شده: با استفاده از سازنده های اولیه، می توانید خصوصیات را مستقیماً در پارامترهای سازنده اعلام و مقداردهی اولیه کنید و تکرار کد را کاهش دهید.
- راهاندازی آسان: میتوانید از سازندههای اولیه برای مقداردهی اولیه خصوصیات یک کلاس با مقادیر پیشفرض یا مقادیر خاصی که به عنوان پارامترهای سازنده ارسال میشوند، استفاده کنید.
- تغییر ناپذیری: میتوانید اصلاحکننده init را روی ویژگیهای اولیهسازی شده در سازنده اصلی اعمال کنید تا مطمئن شوید که آنها پس از مقداردهی اولیه شی فقط خواندنی هستند.
سازندههای اولیه در سی شارپ دارای چندین جنبه منفی نیز هستند.
- کاهش انعطاف پذیری: سازنده های اولیه ساده طراحی شده اند که می تواند انعطاف پذیری آنها را محدود کند. آنها ممکن است زمانی مناسب نباشند که منطق اولیه سازی پیچیده مورد نیاز است یا زمانی که اقدامات اضافی مورد نیاز است، مانند اعتبار سنجی، زمان بندی، یا ورود به سیستم.
- کد کمتر صریح: کاهش کد دیگ بخار عمل خوبی است، اما همچنین می تواند کد را واضح تر کند. توسعهدهندگان بیتجربه ممکن است برای درک نحوه اولیهسازی ویژگیها یا نحوه عملکرد سازنده به کمک نیاز داشته باشند.
- مشکلات سازگاری: ادغام نحو جدید سازنده های اولیه به طور یکپارچه در یک پایگاه کد موجود می تواند چالش برانگیز باشد، به خصوص اگر پایگاه کد بزرگ و پیچیده باشد.
- کنترل محدود بر اصلاح کننده های دسترسی: یک سازنده اولیه کنترل کمتری بر اصلاح کننده های دسترسی نسبت به سازنده سنتی ارائه می دهد. بنابراین سازندگان اولیه ممکن است در سناریوهایی که نیاز به کنترل دقیق روی دسترسی دارند نامناسب باشند.
- منحنی یادگیری: از آنجایی که سازنده های اولیه در زبان برنامه نویسی C# جدید هستند، توسعه دهندگان شما ممکن است به زمان نیاز داشته باشند تا سرعت استفاده از آن را بالا ببرند، که می تواند توسعه پروژه شما را کند کند.
استفاده از سازنده های بارگذاری شده با سازنده اصلی در سی شارپ
شما می توانید در هر کلاسی که سازنده اصلی دارد از سازنده های اضافه بار استفاده کنید. قطعه کد زیر نشان می دهد که چگونه می توانید چندین سازنده در یک کلاس با سازنده اصلی ایجاد کنید.
public class User(int id, string userName, string password) { //Implement the members of the class here }// Other members of the class }
استفاده از سازنده های اولیه در انواع رکورد در مقابل کلاس ها در C#
در حالی که هم رکورد و هم کلاس ها از سازنده های اولیه پشتیبانی می کنند، تفاوت های ظریفی در رفتار وجود دارد. به عنوان مثال، در اینجا نحوه تعریف یک نوع رکورد است که از سازنده اصلی استفاده می کند:
public record AuthorRecord(int Id, string firstName, string lastName, string address, string phone);
و در اینجا نحوه تعریف کلاسی است که از سازنده اصلی استفاده می کند:
public record AuthorClass(int Id, string firstName, string lastName, string address, string phone);
میتوانید نمونهای از نوع رکورد بالا را مطابق شکل زیر ایجاد کنید.
var authorRecord = AuthorRecord(int Id, string firstName, string lastName, string address, string phone);
اما، اگر بخواهید مقادیری را به اعضای داده از نوع رکورد به روش زیر اختصاص دهید، با یک خطای کامپایلر مواجه خواهید شد.
authorRecord.Id = 1;
در مقابل، میتوانید نمونهای از نوع کلاس بالا ایجاد کنید و مقادیری را به اعضای داده آن مانند شکل زیر، بدون هیچ خطای کامپایلر اختصاص دهید.
var authorClass = AuthorClass(int Id, string firstName, string lastName, string address, string phone); authorClass.Id = 1;
از تزریق وابستگی در سازنده های اولیه در C# استفاده کنید
شما می توانید هنگام اجرای تزریق وابستگی در برنامه C# خود از سازنده های اولیه بهره ببرید. اجازه دهید با یک مثال این را بفهمیم. کد زیر نشان می دهد که چگونه می توانیم تزریق سازنده را در سی شارپ پیاده سازی کنیم.
public class AuthorService { private readonly IAuthorRepository _authorRepository; public AuthorService(IAuthorRepository authorRepository) { _authorRepository = authorRepository; } public async Task<IEnumerable<Author>> GetAll() { return await _authorRepository.GetAll(); } }
در نهایت، همانطور که در قسمت کد زیر نشان داده شده است، توجه داشته باشید که چگونه میتوان از سازندههای اصلی برای شفافتر و تمیزتر کردن کدتان استفاده کرد.
public class AuthorService (IAuthorRepository authorRepository) { public async Task<IEnumerable<Author>> GetAll() { return await authorRepository.GetAll(); } }
اگرچه سازنده های اولیه در ابتدا در C# 9 معرفی شدند، اما فقط به انواع رکورد محدود می شدند. با C# 12، میتوانید از سازندههای اولیه در انواع رکوردها، کلاسها و ساختارها استفاده کنید، که به شما کمک میکند تا کد boilerplate را تمیزتر و مختصرتر بنویسید.
پست های مرتبط
نحوه استفاده از سازنده های اولیه در سی شارپ ۱۲
نحوه استفاده از سازنده های اولیه در سی شارپ ۱۲
نحوه استفاده از سازنده های اولیه در سی شارپ ۱۲