بیاموزید که چگونه بین کلاسها، ساختارها و انواع رکوردها در سی شارپ برای قدرت، انعطافپذیری، کارایی و عملکرد انتخاب کنید.
کلاس ها، ساختارها و رکوردها مفاهیم اساسی در برنامه نویسی C# هستند. هر کدام نوع متفاوتی هستند، با ویژگی ها، قابلیت ها و محدودیت های متفاوت. برای گیج شدن بیشتر، آنها دارای ویژگی ها و ویژگی های مشترک هستند.
کلاس ها انواع مرجعی هستند که از مفاهیم شی گرا مفید مانند کپسوله سازی، وراثت و چندشکلی پشتیبانی می کنند. سازه ها انواع ارزش هایی هستند که عملکرد بهتری را ارائه می دهند اما از نظر اندازه و تغییرپذیری دارای محدودیت هایی هستند. رکوردهایی که در C# 9 معرفی شدند، بهترین کلاس ها و ساختارها را با هم به صورت پیش فرض با پشتیبانی از تغییرناپذیری ترکیب می کنند.
چه زمانی باید از ساختارها یا رکوردها به جای کلاس ها در برنامه خود استفاده کنید؟ در این مقاله به بررسی تفاوتهای کلاسها، ساختارها و انواع رکوردها و نحوه کار با این انواع مختلف در سی شارپ خواهیم پرداخت.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را برای ایجاد یک پروژه برنامه کاربردی کنسول NET Core جدید دنبال کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، “NET 8.0 (پشتیبانی طولانی مدت)” را به عنوان نسخه چارچوب انتخاب کنید. چک باکسهای «از بیانیههای سطح بالا استفاده نکنید» و «فعال کردن انتشار AOT بومی» علامت نگذارید. ما از این ویژگیها در اینجا استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کاربردی کنسول NET 8 برای کار با نمونههایی از کلاسها، ساختارها و رکوردها در بخشهای بعدی این مقاله استفاده خواهیم کرد.
استفاده از کلاس ها در C#
یک کلاس در سی شارپ یک نوع مرجع است. به عبارت دیگر، متغیری از نوع کلاس، ارجاعی به یک شی دارد. توجه داشته باشید که می توانید چندین مرجع داشته باشید که به یک شی اشاره می کنند (بنابراین اصلاح شی از طریق یک مرجع، مقدار آن را برای دیگران تغییر می دهد). اعضای یک کلاس (یعنی فیلدها، ویژگیها، متدها، رویدادها و غیره) رفتار و وضعیت نمونههای کلاس را تعریف میکنند.
کلاسهای C# از انتزاع، کپسولهسازی، وراثت و چندشکلی پشتیبانی میکنند. اینها چهار اصل اساسی برنامه نویسی شی گرا هستند.
قطعه کد زیر نحوی را برای تعریف یک کلاس در C# نشان می دهد.
<modifiers> class <name of the class> { //Data members and member functions }
قطعه کد زیر یک کلاس C# معمولی را نشان می دهد.
public class Author { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public string Email { get; set; } public string Phone { get; set; } }
قطعه کد زیر نشان میدهد که چگونه میتوانید کلاس Author را نمونهسازی کنید و مقادیری را برای هر یک از ویژگیهای آن تنظیم کنید.
var author = new Author() { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", Address = "Hyderabad, Imdia", Email = "joydipkanjilal@yahoo.com", Phone = "1234567890" };
استفاده از ساختارها در سی شارپ
یک ساختار در سی شارپ یک نوع مقدار است. یک متغیر از نوع ساختار، نمونه ای از نوع (نه مرجع) را در خود جای می دهد. شما میتوانید از ساختارها در سی شارپ برای ساخت انواع دادههای ترکیبی کوچک استفاده کنید و در عین حال از سربار جمعآوری زباله اجتناب کنید. همچنین میتوان ساختارها را با استفاده از اصلاحکننده فقط خواندنی تغییرناپذیر ساخت.
توجه داشته باشید که وقتی از ساختارها به عنوان پارامتر متد استفاده می کنید، نمونه هایی از ساختارها با مقدار ارسال می شوند. به همین ترتیب، وقتی یک متغیر ساختاری را به متغیر ساختاری دیگر اختصاص میدهید، مقدار آن کپی میشود.
در حالی که میتوانید از فیلدها، ویژگیها و روشها در یک ساختار استفاده کنید، نمیتوانید مفاهیم شی گرا مانند انتزاع، کپسولهسازی، وراثت و چندشکلی را با استفاده از یک ساختار پیادهسازی کنید.
قطعه کد زیر نحوی را برای تعریف ساختار در C# نشان می دهد.
<modifiers> struct <name of the struct> { //Data members and member functions }
قطعه کد زیر یک ساختار معمولی را نشان می دهد.
struct Coordinate { public int x; public int y; }
اکنون می توانید از کد زیر برای ایجاد نمونه ای از این ساختار و مقداردهی اولیه اعضای داده آن استفاده کنید.
Coordinate point = new Coordinate(); point.x = 10; point.y = 20;
استفاده از رکوردها در سی شارپ
انواع رکورد در C# 9 برای نمایش مقادیر تغییرناپذیر معرفی شدند. رکوردها انواع مرجع مانند کلاس ها هستند، اما آنها به طور پیش فرض دارای معنایی برابری مبتنی بر ارزش هستند، مانند ساختارها. میتوانید از انواع رکورد در سی شارپ برای ساخت انواع غیرقابل تغییر و اشیاء ایمن برای رشته استفاده کنید.
رکوردها ویژگیهای داخلی مفیدی مانند یک عبارت برای ایجاد یک رکورد جدید با دادههای اصلاحشده و یک دسترسی آغازین برای تنظیم مقادیر برای ویژگیهای آن فقط در زمان اولیه ارائه میکنند. انواع رکوردها میتوانند دارای ویژگیها، فیلدها، روشها، رویدادها و سازندهها باشند و پشتیبانی محدودی برای وراثت ارائه میکنند. با این حال، آنها از انتزاع، کپسوله سازی و چندشکلی پشتیبانی نمی کنند.
شما میتوانید از انواع رکوردها برای نمایش اشیاء انتقال داده (DTO) و همچنین سایر ساختارهای دادهای که نیاز به تغییر ناپذیری و معنایی برابری دارند، استفاده کنید.
کد زیر را در نظر بگیرید که یک کلاس C# به نام Rectangle را نشان می دهد.
public class Rectangle { public int Length { get; set; } public int Breadth { get; set; } }
میتوانید همان دادهها را با استفاده از یک نوع رکورد به روشی بسیار سادهتر نشان دهید:
public record Rectangle(int Length, int Breadth);
اکنون می توانید با استفاده از کد زیر نمونه ای از نوع رکورد Rectangle ایجاد کنید.
var rectangle = new Rectangle(10, 5);
استفاده از وراثت در انواع رکورد در سی شارپ
یک نوع رکورد در سی شارپ می تواند از نوع رکورد دیگری ارث بری کند، اما نمی تواند از یک کلاس ارث بری کند. قطعه کد زیر نشان می دهد که چگونه یک نوع رکورد می تواند نوع رکورد دیگری را در سی شارپ گسترش دهد.
public record Person(string FirstName, string LastName, string Address) { } public record Author(int id, string LastBookAuthored, string FirstName, string LastName, string Address) : Person(FirstName, LastName, Address) { public int Id { get; set; } public string LastBookAuthored { get; set; } }
اکنون می توانید با استفاده از کد زیر نمونه ای از نوع رکورد ایجاد کنید.
var author = new Author(1, "Mastering C# 8.0", "Joydip", "Kanjilal", "Hyderabad, India");
کلاس ها در مقابل ساختارها در مقابل رکوردها در سی شارپ
از کلاس ها برای نمایش منطق و رفتار پیچیده در برنامه خود استفاده کنید. کلاسها برای مدلسازی ساختارهای داده پیچیدهای طراحی شدند که به مفاهیم شی گرا مانند انتزاع، کپسولهسازی، ترکیب، وراثت و چندشکلی نیاز دارند. با این حال، کلاس ها دارای اشکالات عملکردی خاصی هستند که باید هنگام طراحی برنامه های خود در نظر داشته باشید.
انواع ارزش (ساختارها) از نظر تخصیص و تخصیص حافظه بسیار مقرون به صرفه تر از انواع مرجع (کلاس ها و رکوردها) هستند. هنگامی که می خواهید یک نوع داده ترکیبی با تنها چند عضو داده ایجاد کنید، یک ساختار انتخاب خوبی است. ساختارها برای ساختارهای داده کوچک (با اندازه کمتر از ۱۶ بایت) که به معنای ارزشی نیاز دارند ایده آل هستند. استفاده از ساختار در چنین مواردی به شما کمک می کند از هزینه های جمع آوری زباله و هزینه های سربار مربوطه جلوگیری کنید.
انواع رکورد شکاف بین انواع مرجع و انواع مقدار را پر میکنند و به شما کمک میکنند کدی تمیز، ناب و خوانا بنویسید. زمانی که داده ها دغدغه اصلی شما هستند، یک نوع رکورد را از یک کلاس یا یک ساختار انتخاب کنید. از انواع رکورد برای ایجاد اشیاء انتقال داده، اشیاء پاسخ API، اشیاء پیکربندی، مدلهای تغییرناپذیر و اشیاء ارزش در طراحی دامنه محور استفاده کنید.
انواع رکورد پشتیبانی عالی برای تطبیق الگو ارائه میکنند، و آنها را به انتخاب خوبی برای کار با ساختارهای داده پیچیده تبدیل میکند. انواع رکورد بهطور پیشفرض به گونهای طراحی شدهاند که انواع دادههای تغییرناپذیر باشند—ویژگی که برنامهنویسی عملکردی را تسهیل میکند، جایی که نمیتوانید یک نمونه را پس از ایجاد آن تغییر دهید.
هنگام تصمیمگیری برای استفاده از کلاسها، ساختارها یا رکوردها در C#، استفاده مورد نظر، ویژگیها، مقایسه برابری، تغییرناپذیری و ویژگیهای عملکرد را در نظر بگیرید. به طور خلاصه، کلاس ها زمانی مناسب هستند که به اشیایی با رفتار و منطق پیچیده نیاز دارید، ساختارها برای مقادیر سبک و رفتار حداقلی مناسب هستند، و رکوردها برای ساختارهای داده تغییرناپذیر با قوانین برابری ساده ایده آل هستند.
پست های مرتبط
زمان استفاده از کلاس ها، ساختارها یا رکوردها در سی شارپ
زمان استفاده از کلاس ها، ساختارها یا رکوردها در سی شارپ
زمان استفاده از کلاس ها، ساختارها یا رکوردها در سی شارپ