English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في C#، يتم تصنيف هذه الأنواع بناءً على كيفية تخزينها للقيم في الذاكرة. تشمل C# الفئات التالية من أنواع البيانات:
أنواع القيمة
أنواع المشاركة
أنواع الإشارة
إذا كانت نوع البيانات يحفظ قيمة البيانات في مساحة ذاكرة خاصة بها، فإنها نوع قيمة. هذا يعني أن متغيرات هذه الأنواع تحتوي مباشرة على القيمة.
جميع أنواع القيمة تنتسب إلىSystem.ValueTypeبجنس، وSystem.ValueTypeومرة أخرى منSystem.Objectبجنس
مثلاً، متغير كامل int i = 100;
يخزن النظام 100 في مساحة الذاكرة المخصصة للمتغير i. يوضح الشكل أدناه كيف يتم تخزين 100 في موقع افتراضي في ذاكرة 'i' (0x239110):
جميع أنواع البيانات التالية هي أنواع القيمة:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
عندما تقوم بتقديم متغيرات النوع من طريقة إلى طريقة أخرى، يقوم النظام بإنشاء نسخة فرعية من المتغير في الطريقة الأخرى. إذا قمت بتغيير قيمة في طريقة، لن يؤثر ذلك على المتغير في الطريقة الأخرى.
static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); }
100
200
100
في المثال السابق، حتى بعد نقل متغير i من دالة Main() إلى دالة ChangeValue() وتغيير قيمته، فإنه يظل ثابتًا.
على عكس الأنواع القيمية، لا تخزن الأنواع المشاركة القيمة مباشرة. بدلاً من ذلك، تخزن عنوان الذاكرة للعنصر الذي يحتوي على القيمة. بمعنى آخر، تحتوي الأنواع المشاركة على إشارة إلى موقع آخر يحتوي على البيانات.
على سبيل المثال، النصوص المتالية:
string s = "Hello World!!";
يُظهر الشكل التالي كيفية تخصيص النظام للذاكرة لـ متغير النصوص المذكور أعلاه.
كما يُظهر الشكل أعلاه، يختار النظام موقعًا عشوائيًا في الذاكرة للمتغير s (0x803200). قيمة المتغير s هي 0x600000، وهي عنوان الذاكرة للقيمة الفعلية. لذلك، يُخزن النوع المشارك عنوان الذاكرة للقيمة الفعلية بدلاً من القيمة نفسها.
هذه هي أنواع البيانات المشاركة:
النصوص
القوائم (حتى إذا كانت عناصرها أنواع قيمية)
فئات
مكتبات
عندما تنقل متغيرات النوع المشارك من دالة إلى أخرى، فإنها لا تخلق نسخة جديدة؛ بدلاً من ذلك، تُرسل عنوان الذاكرة للمتغير. لذلك، إذا غيرت قيمة المتغير في الدالة، فإن التغيير سيُظهر أيضًا في الدالة التي تم استدعاؤها.
static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); }
Steve
في المثال السابق، سنقوم بتحويل عميل Student std1 إلى دالة ChangeReferenceType() هنا، يُرسل في الواقع عنوان الذاكرة لـ std1. لذلك، عندما يغير دالة ChangeReferenceType() StudentName، فإنه يغير في الواقع StudentName لـ std1 لأن std1 و std2 يشيران إلى نفس العنوان في الذاكرة.
القيمة الافتراضية للنول هي غير المُبني عند عدم التخصيص. النول يعني عدم إشارة إلى أي عنصر.
لا يمكن أن تكون متغيرات القيمة النوعية نول، لأنها تُخزن القيمة وليس عنوان الذاكرة. تم إدخال النوع القابل للنول في C# 2.0، مما يسمح بتعيين نول أو إعلان متغيرات القيمة النوعية دون تخصيصها قيمة.