۱۴۰۴/۰۷/۰۹ Nebular

انواع داده در سی شارپ

۱. Value Type vs Reference Type

Value Type

  • مثال‌ها: int, double, bool, struct, enum
  • ویژگی‌ها:
    1. ذخیره در Stack: حافظه سریع و موقت.
    2. کپی هنگام انتساب: وقتی یک value type به متغیر دیگری داده می‌شود، یک کپی مستقل ساخته می‌شود. تغییر در یکی دیگری را تحت تأثیر قرار نمی‌دهد.

مثال:

int a = 10;
int b = a;  // مقدار a کپی شد
b = 20;
Console.WriteLine(a); // خروجی: 10

همان‌طور که می‌بینی، تغییر b تاثیری روی a ندارد.


Reference Type

  • مثال‌ها: class, string, object, array
  • ویژگی‌ها:
    1. ذخیره در Heap: حافظه بزرگ و مدیریت شده توسط GC.
    2. انتساب، مرجع را کپی می‌کند: وقتی یک reference type به متغیر دیگر داده می‌شود، هر دو متغیر به همان شیء روی heap اشاره می‌کنند. تغییر در یکی، روی دیگری اثر می‌گذارد.

مثال:

class Person
{
    public string Name;
}

Person p1 = new Person { Name = "Ali" };
Person p2 = p1;  // مرجع کپی شد
p2.Name = "Reza";
Console.WriteLine(p1.Name); // خروجی: Reza

توجه کن، تغییر در p2 روی p1 هم تأثیر گذاشت، چون هر دو به یک شیء اشاره دارند.


Boxing و Unboxing

  • Boxing → تبدیل یک value type به reference type
  • Unboxing → تبدیل یک reference type که در واقع یک value type را نگه داشته، دوباره به value type تبدیل می‌کند.

مثال:

int x = 123;       // value type
object o = x;      // boxing -> x به object تبدیل شد و در heap قرار گرفت
int y = (int)o;    // unboxing -> دوباره به int تبدیل شد

هزینه Box/Unbox نسبت به استفاده مستقیم از value type بیشتر است، بنابراین در performance-sensitive code بهتر است از آن پرهیز شود یا از Generics استفاده کنیم.


Nullable types

  • مسئله: Value type مثل int نمی‌تواند به طور پیش‌فرض null داشته باشد.
  • راه حل: از Nullable<T> یا شکل کوتاه آن T? استفاده می‌کنیم.

مثال:

int? age = null;
if (age.HasValue)
{
    Console.WriteLine(age.Value);
}
else
{
    Console.WriteLine("Age not provided"); // خروجی
}
  • HasValue → بررسی می‌کند که مقدار null نیست.
  • Value → مقدار واقعی را برمی‌گرداند، اگر null باشد استثنا می‌دهد.

نکته مهم برای آزمون:

  • سوال‌های کلاسیک:
    1. فرق stack و heap
    2. چه زمانی یک تغییر در متغیر بر دیگری تأثیر می‌گذارد (copy vs reference)
    3. Nullable types و دسترسی به Value و HasValue
    4. مثال‌های ساده Boxing/Unboxing
Accept Cookies
Accept Cookies
[your-shortcode]