متغیرها، انواع داده‌ها و تفاوت نوع مقدار و مرجع در زبان سی‌شارپ

اگر می‌خواهید برنامه‌ نویسی با زبان سی‌شارپ (#C) را اصولی یاد بگیرید، یکی از مهم‌ ترین مفاهیمی که باید به‌ خوبی درک کنید، مفهوم متغیرها (Variables)، انواع داده‌ها (Data Types) و تفاوت بین Value Type و Reference Type است. این مفاهیم پایه، نقش مهمی در عملکرد صحیح برنامه شما دارند. در این مقاله، همه این مفاهیم را به زبان ساده و کاربردی بررسی می‌ کنیم.

متغیر چیست و چرا مهم است؟

متغیر در سی‌ شارپ به‌ معنای یک فضای حافظه است که مقدار مشخصی را در خود نگه می‌ دارد. متغیرها به ما این امکان را می‌ دهند که داده‌ها را ذخیره کرده، تغییر دهیم یا به آنها دسترسی پیدا کنیم. نوع متغیر تعیین می‌ کند که چه نوع داده‌ ای در آن ذخیره می‌ شود و چه عملیاتی می‌ توان روی آن انجام داد.

نحوه تعریف متغیر

int age = 25;
string name = "Ali";
bool isActive = true;

در کد بالا، سه متغیر تعریف شده‌اند: یک عدد صحیح، یک رشته متنی و یک مقدار بولی. هر کدام دارای نوع خاصی از داده هستند.

انواع داده‌ها در #C

در زبان #C، داده‌ها به دو دسته کلی تقسیم می‌شوند:

  • Value Types (نوع مقدار): مانند int، float، bool، char، struct
  • Reference Types (نوع مرجع): مانند string، class، array، interface، delegate

Value Type چیست؟

داده‌های نوع مقدار مستقیماً در حافظه Stack ذخیره می‌شوند. زمانی که یک متغیر از نوع مقدار را به متغیر دیگری اختصاص می‌دهیم، کپی مستقلی از مقدار به متغیر جدید داده می‌شود. بنابراین هر تغییری در یکی، روی دیگری تأثیر ندارد.

int a = 5;
int b = a;
b = 10;
Console.WriteLine(a); // خروجی: 5

Reference Type چیست؟

نوع مرجع در حافظه Heap ذخیره می‌شود. متغیر فقط آدرس حافظه را نگه می‌دارد. زمانی که یک متغیر مرجع را به متغیر دیگری اختصاص می‌دهیم، هر دو به یک مکان اشاره می‌کنند.

class Person
{
    public string Name;
}

Person p1 = new Person();
p1.Name = "Ali";

Person p2 = p1;
p2.Name = "Reza";

Console.WriteLine(p1.Name); // خروجی: Reza

Stack و Heap چیست؟

Stack: حافظه‌ای سریع برای ذخیره مقادیر موقت و کوچک مثل Value Types. هر بار که متدی صدا زده می‌شود، فضای مربوط به پارامترها و متغیرهای محلی آن در Stack ایجاد می‌شود.

Heap: حافظه‌ای بزرگ‌تر و کندتر که برای ذخیره اشیای Reference Type به کار می‌رود. GC (Garbage Collector) مسئول پاک‌سازی حافظه Heap است.

مثال ترکیبی: تفاوت رفتار در متد

void ModifyValue(int x)
{
    x = x + 10;
}

void ModifyObject(Person p)
{
    p.Name = "Changed";
}

int a = 5;
ModifyValue(a);
Console.WriteLine(a); // همچنان 5

Person p1 = new Person();
p1.Name = "Ali";
ModifyObject(p1);
Console.WriteLine(p1.Name); // خروجی: Changed

ساختار (struct) و کلاس (class)

درسی شارپ، structها نوع مقدار هستند، در حالی‌ که classها نوع مرجع‌اند.

struct Point
{
    public int X;
    public int Y;
}

class Car
{
    public string Model;
    public int Year;
}

boxing و unboxing

وقتی یک Value Type را به Reference Type تبدیل می‌کنید (مثلاً object)، به آن Boxing می‌گویند. زمانی که دوباره به نوع اصلی تبدیل شود، به آن Unboxing می‌گویند.

int x = 123;
object obj = x; // boxing
int y = (int)obj; // unboxing

نکات بهینه‌ سازی و عملکرد

  • در مواقعی که به سرعت و مصرف کم حافظه نیاز دارید، از Value Type استفاده کنید.
  • در ساختارهای پیچیده‌ تر یا زمانی که به اشتراک داده نیاز دارید، از Reference Type بهره ببرید.
  • همیشه در انتقال پارامترهای Reference Type به متدها مراقب تغییرات ناخواسته باشید.

جمع‌بندی

درک درست از متغیرها، انواع داده‌ها و تفاوت بین Value Type و Reference Type در سی‌شارپ از مهم‌ترین اصول برنامه‌نویسی شی‌گرا است. این مفاهیم نه تنها در طراحی بهتر کلاس‌ها و ساختار داده‌ها به شما کمک می‌کنند، بلکه تأثیر مستقیم برعملکرد برنامه شما دارند.