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» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.