فصل 21 از 40 درس 1 از 1

Struct، Enum و Record

Struct، Enum و Record

بخشی از آموزش جامع C# و .NET 10

محتوای درس Struct، Enum و Record

C# علاوه بر Class، Typeهای دیگری برای مدل‌سازی داده ارائه می‌کند. Struct برای مقادیر کوچک، Enum برای مجموعه گزینه‌های نام‌دار و Record برای مدل‌های داده‌محور با Value Equality مناسب است.

۱. Struct

Struct یک Value Type است و برای داده‌های کوچک، مستقل و معمولاً تغییرناپذیر مناسب است.

مثال

readonly struct Point{public double X{get;} public Point(double x)=>X=x;}

در این مثال، مفهوم «Struct» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Enum

Enum مجموعه‌ای از مقادیر ثابت نام‌دار ایجاد می‌کند و خوانایی را نسبت به Magic Number افزایش می‌دهد.

مثال

enum OrderStatus{Draft,Paid,Shipped}
         OrderStatus s=OrderStatus.Paid;

در این مثال، مفهوم «Enum» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Record

Record به‌صورت پیش‌فرض Value-based Equality و نمایش متنی مناسب‌تری برای مدل‌های داده فراهم می‌کند.

مثال

record ProductDto(int Id,string Name);
         Console.WriteLine(new ProductDto(1,"Mouse"));

در این مثال، مفهوم «Record» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Record Struct

Record Struct ترکیبی از Value Type و ویژگی‌های Record است.

مثال

readonly struct Point{public double X{get;} public Point(double x)=>X=x;}

در این مثال، مفهوم «Record Struct» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. انتخاب Type

انتخاب میان Class، Struct و Record باید بر اساس هویت، اندازه، تغییرپذیری و semantics برابری انجام شود.

مثال

record UserDto(int Id,string Name);
         class UserEntity{public int Id{get;set;}}

در این مثال، مفهوم «انتخاب Type» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

public enum OrderStatus
         {
             Pending,
             Paid,
             Shipped,
             Delivered,
             Cancelled
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

public record ProductDto(int Id, string Name, decimal Price);
         
         var p1 = new ProductDto(1, "Mouse", 900_000m);
         var p2 = p1 with { Price = 950_000m };

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• استفاده از Struct بزرگ و Mutable

• جایگزینی همه Classها با Record بدون توجه به Identity

• ذخیره اعداد خام به‌جای Enum برای وضعیت‌های دامنه

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

برای وضعیت پرداخت یک Enum و برای داده انتقالی محصول یک Record تعریف کنید و با with نسخه تغییر‌یافته بسازید.

۱۰. جمع‌بندی

در این فصل، مبانی «Struct، Enum و Record» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.