#csharp_for_beginners
ساختار یا struct نوعی value type در زبان سیشارپ است که برای نگهداری دادهها و رفتار مرتبط با آنها استفاده میشود.
وقتی متغیری از نوع struct ساخته میشود، دادهها مستقیماً درون آن متغیر ذخیره میشوند، نه در یک شیء جداگانه در heap.
در نتیجه، وقتی یک struct به متد ارسال یا از متد بازگردانده میشود، کل مقدار آن کپی میگردد.
به همین دلیل، struct برای انواع دادهای کوچک و مستقل مناسب است.
در مقابل، اگر نوعی داده رفتار پیچیده یا اندازهی بزرگ دارد، معمولاً کلاس گزینهی بهتری است.
مثال ساده از تعریف ساختار
public struct Coords
{
public Coords(double x, double y)
{
X = x
Y = y
}
public double X { get }
public double Y { get }
public override string ToString() => $"({X}, {Y})"
}
یک نوع دیگر به نام readonly struct & readonly
میتوان یک ساختار را با کلیدواژه readonly تعریف کرد تا تغییرناپذیر باشد.
در یک readonly struct تمام فیلدها باید readonly باشند و تمام ویژگیها (properties) باید فقط getter داشته باشند یا از نوع init باشند. در این حالت ساختار دیگر قابل تغییر نیست و اطمینان حاصل میشود که دادهها پس از ساخت ثابت باقی میمانند.
همچنین میتوان متدهای خاصی را با کلیدواژه readonly مشخص کرد تا نشان دهد که این متدها وضعیت ساختار را تغییر نمیدهند. اگر چنین متدی درون ساختار فراخوانی شود، کامپایلر از تغییر وضعیت جلوگیری میکند و در صورت نیاز، یک کپی موقت از ساختار ایجاد میکند.
مثال از readonly struct
public readonly struct Coords
{
public Coords(double x, double y)
{
X = x
Y = y
}
public double X { get; init; }
public double Y { get; init; }
public readonly override string ToString() => $"({X}, {Y})"
}
آرایههای درونخطی (inline arrays)
از نسخهی سیشارپ ۱۲ به بعد، امکان تعریف آرایههای درونخطی در قالب struct فراهم شده است. در این نوع ساختار، فقط یک فیلد داخلی وجود دارد که شامل یک بلوک پیوسته از عناصر داده است. این ویژگی برای موقعیتهایی که نیاز به سرعت بالا و دسترسی سریع به حافظه وجود دارد مفید است.
مقداردهی اولیه و مقدار پیشفرض struct
ساختارها مستقیماً دادهها را درون خود ذخیره میکنند. هنگامی که از دستور default برای ساختار استفاده شود، همهی فیلدها با مقدار پیشفرض خود مقداردهی میشوند و هیچ سازندهای فراخوانی نمیشود.
اگر برای ساختار سازندهی بدون پارامتر تعریف شود، باز هم دستور default آن را فراخوانی نمیکند و مقدار پیشفرض برای هر فیلد اعمال میشود.
از سیشارپ ۱۱ به بعد اگر سازنده مقداری برای فیلدها تعیین نکند، کامپایلر به صورت خودکار آنها را با مقدار پیشفرض مقداردهی میکند.
همچنین میتوان بدون استفاده از new یک متغیر از نوع ساختار تعریف کرد، اما در این صورت تمام فیلدهای آن باید پیش از استفاده مقداردهی شوند.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______