عرشیا دنیابین
عرشیا دنیابین
خواندن ۳ دقیقه·۱ سال پیش

struct و ref در سی شارپ چیست ؟

ما از قدیم الیام تو سی شارپ struct رو داشتیم ، (به نقل از داکیومنت مایکروسافت)struct از نوع value type هست و بهمون کمک میکنه تا دیتا و مشتقاتش رو کپسوله کنیم ، بخوام ساده تر تعریفش کنم یک data structure کوچیک و سبک رو برامون در نهایت به ارمغان میاره
اگر سطح پایین تر هم بخوام توضیحش بدم ، زمانی که شما یک instance از Struct تغریف میکنید مثل اکثر متغییر های دیگه ایی که تعریف میکنید میره میشینه توی stack حافظمون، نمونه سینتکسشم پایین میذارم :

Nondestructive mutation :

جهش غیر مخرب یا همون 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 نمیتواند :
    - المانی از یک آرایه یا کالکشن باشد.
    -نمیتواند یک interface رو پیاده سازی کند.
    - نمیتواند از lambda expression یا یک تابع محلی دریافت شود.
    -نمیتواند در یک متود async استفاده شود (اما میتوان از اون در مفاهیم همزمانی استفاده کرد مثلا متودی که یک Task و یا Task<T> خروجی میدهد).

-نمیتواند در حلقه ها استفاده شود.
همینطور ref struct به نسبت struct مدت زمان کوتاه تری در حافظه میمونه ، به طور مثال شما اگر در سطوح بالاتر (خارج از Scope فعلی) یک struct تغریف کنید، تا وقتی از Scope فعلی خارج نشیم و یا به نحوی صریحا از حافظه حذفش نکنیم باقی میمونه. اما ref struct یکم لوسه : ) برای سناریو های کوتاه مدت تر تخصیص داده میشود. کاربردش زمانیه که شما به یه data structure با بازدهی بالا و طول عمر کم احتیاج دارید(مثل ایجاد کردن تعداد زیادی object) و ما ref struct رو خیلی محدود میتونیم استفاده کنیم یعنی صرفا محدود هست به scope ایی که درش تعریف شده و نمیتوان اون رو جای دیگری استفاده کرد.

تو سی شارپ 11 مایکروسافت ref field رو اضافه کرده که یه هزار توی از پیچیدگی برای ref struct و کلا ref ایجاد کرده (البته از نظر من :) )

برای چک کردن نال بودن یا نبودن یک ref field از Unsafe.IsNullRef&amp;lt;T&amp;gt;(T) استفاده میشود


ما میتونیم ref struct هامون رو readonly هم تعریف کنیم به سه روش ، با توجه به اینکه توضیح دادن این موضوع قطعا کمکی نمیکنه مثال کدی میزنم براش :


1- readonly ref :

شما میتوانید  به وسیله =  فقط درون یک constructor  و یا تعریف اولیه آن را مقدار دهید.
شما میتوانید به وسیله = فقط درون یک constructor و یا تعریف اولیه آن را مقدار دهید.

2-ref readonly :

این دوستمون رو نمیشه به وسیله = هر جایی مقدار داد.
این دوستمون رو نمیشه به وسیله = هر جایی مقدار داد.

3-readonly ref readonly

این دوستمون رو فقط میشه تو constructor  و تعریف اولیه اون ref reassign  کرد و هر جایی از کد هم نمیشه این کار رو کرد.
این دوستمون رو فقط میشه تو constructor و تعریف اولیه اون ref reassign کرد و هر جایی از کد هم نمیشه این کار رو کرد.


اگر براتون پیچیده و سخته و متوجهش نمیشید سعی کنید ازش استفاده کنید ، واضح میشه بعد یه مدتی..
خوب باشین : )

سی شارپ
شاید از این پست‌ها خوشتان بیاید