ما از قدیم الیام تو سی شارپ struct رو داشتیم ، (به نقل از داکیومنت مایکروسافت)struct از نوع value type هست و بهمون کمک میکنه تا دیتا و مشتقاتش رو کپسوله کنیم ، بخوام ساده تر تعریفش کنم یک data structure کوچیک و سبک رو برامون در نهایت به ارمغان میاره
اگر سطح پایین تر هم بخوام توضیحش بدم ، زمانی که شما یک instance از Struct تغریف میکنید مثل اکثر متغییر های دیگه ایی که تعریف میکنید میره میشینه توی stack حافظمون، نمونه سینتکسشم پایین میذارم :
جهش غیر مخرب یا همون Nondestructive mutation ، با معرفی سی شارپ 10 ما میتوانیم به وسیله کلید واژه With میتونیم یک کپی از یک Instance با خواص و فیلد های مشخص برای خوردمون ایجاد کنیم به طور مثال :
همچنین میتونیم به وسیله Generic Constraint ورودی تایپ و متودمون رو محدود به value type ها کنیم :
مثلا Container ما الان فقط میتونه Value Type هارو به عنوان ورودی Constructor اش بگیره (عدد ، کارکتر ، تاریخ و struct ایی که خودمون تعریف کردیم و ... ) و بدیهیه اگر به ورودی Constructor رشته (و هر ReferenceType دیگه ایی)پاس بدیم خطا خواهیم گرفت.
اگر راجع به ValueType و ReferenceType ها سوال دارید پیشنهاد میکنم ابتدا مقاله دیگم در این مورد رو بخونید.
ما میتونیم ref struct هم تعریف کنیم که تفاوتش با struct اینه که نمیتونیم به عنوان ارگومان به یه متود پاسش بدیم یا نمیتونیم type دیگری رو مثل class باهاش مقدار دهی کنیم.
-نمیتواند در حلقه ها استفاده شود.
همینطور ref struct به نسبت struct مدت زمان کوتاه تری در حافظه میمونه ، به طور مثال شما اگر در سطوح بالاتر (خارج از Scope فعلی) یک struct تغریف کنید، تا وقتی از Scope فعلی خارج نشیم و یا به نحوی صریحا از حافظه حذفش نکنیم باقی میمونه. اما ref struct یکم لوسه : ) برای سناریو های کوتاه مدت تر تخصیص داده میشود. کاربردش زمانیه که شما به یه data structure با بازدهی بالا و طول عمر کم احتیاج دارید(مثل ایجاد کردن تعداد زیادی object) و ما ref struct رو خیلی محدود میتونیم استفاده کنیم یعنی صرفا محدود هست به scope ایی که درش تعریف شده و نمیتوان اون رو جای دیگری استفاده کرد.
تو سی شارپ 11 مایکروسافت ref field رو اضافه کرده که یه هزار توی از پیچیدگی برای ref struct و کلا ref ایجاد کرده (البته از نظر من :) )
برای چک کردن نال بودن یا نبودن یک ref field از Unsafe.IsNullRef<T>(T) استفاده میشود
ما میتونیم ref struct هامون رو readonly هم تعریف کنیم به سه روش ، با توجه به اینکه توضیح دادن این موضوع قطعا کمکی نمیکنه مثال کدی میزنم براش :
1- readonly ref :
2-ref readonly :
3-readonly ref readonly
اگر براتون پیچیده و سخته و متوجهش نمیشید سعی کنید ازش استفاده کنید ، واضح میشه بعد یه مدتی..
خوب باشین : )