Open Aida-Hagh opened 5 months 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 یک نوع مقدار است ودر استک ذخیره میشود، اما به دادهای که در هیپ ذخیره شده اشاره میکند.
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 تغییر میکند، به جای تغییر در محل حافظه اصلی، یک شیء جدید ایجاد میشود.
هیپ (Heap) و استک (Stack) دو نوع مختلف از حافظه هستند. استک (Stack): معمولاً انواع دادههای مقدار (value types) مانند int, float, struct و متغیرهای محلی در استک ذخیره میشوند. هیپ (Heap): انواع مرجع (reference types) مانند کلاسها، آرایهها و اشیاء در هیپ ذخیره میشوند( مقدار داخلش در هیپ ذخیره میشه آدرسش در استک).