AidaHagh / C-Sharp

Learn C#
1 stars 0 forks source link

Stack Memory & Heap Memory #17

Open AidaHagh opened 1 month ago

AidaHagh commented 1 month ago

هیپ (Heap) و استک (Stack) دو نوع مختلف از حافظه هستند. استک (Stack): معمولاً انواع داده‌های مقدار (value types) مانند int, float, struct و متغیرهای محلی در استک ذخیره می‌شوند. هیپ (Heap): انواع مرجع (reference types) مانند کلاس‌ها، آرایه‌ها و اشیاء در هیپ ذخیره می‌شوند( مقدار داخلش در هیپ ذخیره میشه آدرسش در استک).

AidaHagh commented 1 month ago

heap-stack


انتقال داده:

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

AidaHagh commented 1 month ago

class Program {

static void Main()
{
    int value = 5; // value در استک ذخیره می‌شود

    Person person = new Person(); // person در هیپ ذخیره می‌شود
    person.Name = "John"; // مقدار Name در هیپ ذخیره می‌شود

    ProcessPerson(person);
}

static void ProcessPerson(Person person)
{
    string name = person.Name; // name در استک ذخیره می‌شود، اما اشاره‌گر به Name در هیپ است
    Console.WriteLine(name);
}

}

class Person { public string Name { get; set; } }


متغیر name در متد ProcessPerson یک نوع مقدار است ودر استک ذخیره می‌شود، اما به داده‌ای که در هیپ ذخیره شده اشاره می‌کند.

AidaHagh commented 1 month ago

class Program { static void Main() { string str1 = "Hello"; string str2 = str1; str2 = "World"; Console.WriteLine(str1); // خروجی: Hello Console.WriteLine(str2); // خروجی: World } }


استک: str1 و str2 متغیرهای محلی هستند و به عنوان اشاره‌گر (reference) در استک ذخیره می‌شوند. این اشاره‌گرها به آدرس‌های حافظه در هیپ اشاره می‌کنند. هیپ: مقدار "Hello" به عنوان یک شیء string در هیپ ذخیره می‌شود. مقدار "World" نیز به عنوان یک شیء string جداگانه در هیپ ذخیره می‌شود. (در کل یعنی مقدار داخلش در هیپ ذخیره میشه آدرسش در استک) علت اینکه string در برخی موارد شبیه به انواع مقدار رفتار می‌کند، این است که string تغییرناپذیر (immutable) است. به این معنی که هرگونه تغییر در مقدار یک string باعث ایجاد یک شیء جدید در هیپ می‌شود و اشاره‌گر (reference) به این شیء جدید در استک به‌روز می‌شود. بنابراین، وقتی مقدار یک string تغییر می‌کند، به جای تغییر در محل حافظه اصلی، یک شیء جدید ایجاد می‌شود.