نوع داده (Referenceو Value ) در سی شارپ
نوع داده (Referenceو Value ) در سی شارپ Reference Types با ارجاع منتقل میشوند، اما Value Types در Stack مستقیماً کپی میشوند.
نوع داده (Reference,Value ) در سی شارپ
در زبان سی شارپ، دادهها به دو دسته Reference Type (نوع ارجاعی) و Value Type (نوع مقداری) تقسیم میشوند.
نوعهای مقداری (Value Types) شامل دادههایی مانند int، float، double، char، bool و ساختارها (Structs) هستند که مستقیماً در Stack ذخیره میشوند.
هنگام مقداردهی یک متغیر مقداری به متغیر دیگر، یک کپی مستقل از مقدار ایجاد میشود، به این معنی که تغییر مقدار در یکی، تأثیری روی دیگری ندارد.
این ویژگی باعث اجرای سریعتر برنامه و کاهش فشار بر حافظه میشود، اما ممکن است برای دادههای حجیم، مصرف حافظه را افزایش دهد.
در مقابل، نوعهای ارجاعی (Reference Types) شامل کلاسها (Classes)، آرایهها (Arrays)، رشتهها (Strings)، رابطها (Interfaces) و اشیاء پویا (Objects) هستند که در Heap ذخیره میشوند.
در این نوع دادهها، متغیر فقط یک آدرس حافظه (Reference) را نگه میدارد، و هنگام مقداردهی به متغیر دیگر، فقط این آدرس کپی میشود، نه خود داده.
این ویژگی باعث میشود چندین متغیر به یک شیء مشترک اشاره کنند، که در برخی موارد مزیت محسوب میشود اما میتواند منجر به تغییرات ناخواسته در دادهها شود.
برای مدیریت حافظه، Garbage Collector به صورت خودکار اشیای بلااستفاده را پاکسازی میکند، اما این فرآیند ممکن است باعث کاهش کارایی در برخی شرایط شود.
ویژگیهای اصلی Value Types در سی شارپ
نوعهای مقداری در stack ذخیره میشوند و مستقیماً مقدار را نگه میدارند. وقتی یک متغیر از نوع Value Type مقداردهی میشود، یک کپی از مقدار در حافظه ایجاد میشود.
ویژگی آن شامل:
-
مقدار واقعی درون متغیر ذخیره میشود.
-
در stack حافظه ذخیره میشوند.
-
از لحاظ عملکردی سریعتر هستند، زیرا تخصیص و آزادسازی حافظه در stack بهینهتر است.
-
هنگام انتساب (assignment)، مقدار کپی میشود و دو متغیر مستقل از یکدیگر خواهند بود.
مثال از Value Types در #C
int a = 10;
int b = a; // مقدار a به b کپی میشود
b = 20;
Console.WriteLine(a); // خروجی: 10
Console.WriteLine(b); // خروجی: 20
در مثال بالا، مقدار متغیر a به b کپی شده و تغییر b تأثیری بر a ندارد.
انواع دادهای از نوع Value Type
در #C، دادههای زیر بهعنوان Value Type در نظر گرفته میشوند:
-
انواع عددی
int, float, double, decimal -
انواع صحیح
byte, sbyte, short, ushort, long, ulong -
انواع منطقی
bool -
انواع کاراکتری
char -
ساختارها (Structs) و شمارشها (Enums)
struct, enum
ویژگیهای اصلی Reference Types در سی شارپ
نوع دادههای Reference Types در حافظه heap ذخیره میشوند و متغیر تنها یک اشارهگر (reference) به موقعیت حافظه را نگه میدارد.
ویژگیهای اصلی Reference Types شامل:
-
متغیرها یک آدرس حافظه را در heap ذخیره میکنند، نه مقدار اصلی.
-
تغییر مقدار در یک متغیر باعث تغییر در سایر متغیرهایی که به همان آدرس اشاره دارند، میشود.
-
در مقایسه با نوعهای مقداری، دسترسی به دادهها در heap کندتر است.
-
نیاز به مدیریت حافظه دارند (جمعآوری زباله Garbage Collection).
مثال از Reference Types در سی شارپ
class Person
{
public string Name;
}
Person p1 = new Person();
p1.Name = "Ali";
Person p2 = p1; // p2 به همان شیء در حافظه heap اشاره میکند
p2.Name = "Reza";
Console.WriteLine(p1.Name); // خروجی: Reza
Console.WriteLine(p2.Name); // خروجی: Reza
در این مثال، چون p1 و p2 هر دو به یک شیء در heap اشاره میکنند، تغییر مقدار در p2 روی p1 نیز تأثیر میگذارد.
انواع دادهای از نوع Reference Type
-
کلاسها (Classes)
class -
آرایهها (Arrays)
int[], string[] -
رشتهها (Strings)
string -
واسطها (Interfaces)
interface -
اشیای دینامیک (Dynamic Objects)
object, dynamic
ساختار (Struct) در مقابل کلاس (Class)
در زبان #C، کلاس (Class) یک Reference Type است که دادههای آن در Heap ذخیره میشود. این بدان معناست که هنگام مقداردهی یک کلاس به متغیر دیگر، فقط آدرس حافظه کپی شده و هر دو متغیر به یک شیء اشاره میکنند.
کلاسها از وراثت (Inheritance) پشتیبانی کرده و میتوانند متدهای مجازی (Virtual Methods) داشته باشند.
از آنجا که مدیریت حافظه در Heap توسط Garbage Collector انجام میشود، ممکن است تأخیر در اجرای برنامه ایجاد کند. کلاسها بیشتر در مواردی استفاده میشوند که دادهها پیچیده و حجیم باشند و نیاز به انعطافپذیری بالا داشته باشند.
در مقابل، ساختار (Struct) یک Value Type است که دادههای آن در Stack ذخیره میشود.
مقدار یک ساختار هنگام انتساب به متغیر دیگر، کپی میشود، بنابراین هر متغیر یک نسخه مستقل از داده را دارد. ساختارها از وراثت پشتیبانی نمیکنند و همچنین امکان تعریف متدهای مجازی در آنها وجود ندارد.
از آنجایی که نیازی به Garbage Collection ندارند، عملکرد سریعتری دارند و برای دادههای کوچک و سبک که نیاز به پردازش سریع دارند (مانند مختصات، رنگها و دادههای عددی) مناسبتر هستند.
🌟 آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
مثال از Struct در سی شارپ
struct Point
{
public int X;
public int Y;
}
Point p1 = new Point();
p1.X = 10;
p1.Y = 20;
Point p2 = p1; // مقدار p1 در p2 کپی میشود
p2.X = 50;
Console.WriteLine(p1.X); // خروجی: 10
Console.WriteLine(p2.X); // خروجی: 50
در مثال بالا، مقدار p1 به p2 کپی شده و تغییر در p2 تأثیری روی p1 ندارد.
کدام نوع داده را انتخاب کنیم؟
انتخاب بین Value Type و Reference Type بستگی به نیازهای پروژه دارد:
-
اگر دادهها کوچک و سبک هستند → از Value Type استفاده کنید.
-
اگر دادهها پیچیده و بزرگ هستند → از Reference Type استفاده کنید.
-
اگر نیاز به ارثبری (Inheritance) دارید → از کلاس (Class) استفاده کنید.
-
اگر میخواهید از سربار حافظه جلوگیری کنید → از ساختار (Struct) استفاده کنید.
مثال پروژه محور برای درک تفاوت بین Reference Type و Value Type در سی شارپ
در این مثال، یک کلاس (Reference Type) و یک ساختار (Value Type) را تعریف میکنیم و تفاوت نحوه مقداردهی و تأثیر آنها را در یک سناریوی عملی بررسی میکنیم.
سناریو: مدیریت اطلاعات کارمندان و مختصات دفتر کار
در این پروژه، اطلاعات کارمندان شامل نام و سن در قالب کلاس (Employee) و مختصات محل کار آنها در قالب ساختار (OfficeLocation) ذخیره میشود.
تعریف کلاس (Reference Type) و ساختار (Value Type)
using System;
class Employee // Reference Type
{
public string Name;
public int Age;
}
struct OfficeLocation // Value Type
{
public int X;
public int Y;
}
class Program
{
static void Main()
{
// مقداردهی به کلاس (Reference Type)
Employee emp1 = new Employee();
emp1.Name = "Ali";
emp1.Age = 30;
Employee emp2 = emp1; // فقط آدرس حافظه کپی میشود (Reference Copy)
emp2.Name = "Reza"; // تغییر در emp2، مقدار emp1 را نیز تغییر میدهد
Console.WriteLine($"Employee 1 Name: {emp1.Name}"); // خروجی: Reza
Console.WriteLine($"Employee 2 Name: {emp2.Name}"); // خروجی: Reza
// مقداردهی به ساختار (Value Type)
OfficeLocation loc1 = new OfficeLocation { X = 100, Y = 200 };
OfficeLocation loc2 = loc1; // مقدار loc1 در loc2 کپی میشود (Value Copy)
loc2.X = 500; // تغییر در loc2، مقدار loc1 را تغییر نمیدهد
Console.WriteLine($"Office Location 1 X: {loc1.X}"); // خروجی: 100
Console.WriteLine($"Office Location 2 X: {loc2.X}"); // خروجی: 500
}
}
تحلیل پروژه
کلاس Employee: یک Reference Type است. هنگام مقداردهی emp1 به emp2، فقط آدرس حافظه کپی میشود، بنابراین تغییر مقدار در emp2، مقدار emp1 را نیز تغییر میدهد.
ساختار OfficeLocation: یک Value Type است. هنگام مقداردهی loc1 به loc2، یک کپی مستقل از مقدار ایجاد میشود، بنابراین تغییر مقدار در loc2 تأثیری روی loc1 ندارد.
خروجی برنامه
Employee 1 Name: Reza
Employee 2 Name: Reza
Office Location 1 X: 100
Office Location 2 X: 500




کاربران ما
شما هم نظرتون با ما دریاره “نوع داده (Referenceو Value ) در سی شارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید