Menu
flag Ar iconالعربيةdown icon

أنواع البيانات في C#: int وdouble وdecimal وchar وbool ونطاقاتها

كل نوع مدمج في C# بحجمه ونطاقه ولاحقة قيمته الحرفية، والفرق بين أنواع القيم والأنواع المرجعية، ولماذا decimal هو نوع المال، وتجاوز سعة الأعداد الصحيحة وchecked، والقيم الافتراضية.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

C# ثابتة الأنواع: لكل متغيّر وحقل وتعبير نوع معروف وقت الترجمة. في اللغة مجموعة من الأنواع المدمجة لها كلماتها المحجوزة الخاصة (int وdouble وstring...). كل كلمة محجوزة اسم مستعار لنوع في فضاء الأسماء System، فـ int وSystem.Int32 النوع نفسه، وstring وSystem.String النوع نفسه.

الأنواع المدمجة

النوعنوع .NETالحجمالنطاق أو الدقةالقيمة الحرفية
boolBoolean1 بايتtrue أو falsetrue
byteByte1 بايتمن 0 إلى 255200
sbyteSByte1 بايتمن -128 إلى 127-5
shortInt162 بايتمن -32,768 إلى 32,7671200
ushortUInt162 بايتمن 0 إلى 65,53560000
intInt324 بايتمن -2,147,483,648 إلى 2,147,483,64742
uintUInt324 بايتمن 0 إلى 4,294,967,29542u
longInt648 بايتنحو ±9.2 × 10^1842L
ulongUInt648 بايتمن 0 إلى نحو 1.8 × 10^1942ul
floatSingle4 بايتنحو ±3.4 × 10^38، ~6 إلى 9 أرقام2.5f
doubleDouble8 بايتنحو ±1.8 × 10^308، ~15 إلى 17 رقمًا2.5 أو 2.5d
decimalDecimal16 بايتنحو ±7.9 × 10^28، 28 إلى 29 رقمًا2.5m
charChar2 بايتوحدة ترميز UTF-16 واحدة، من U+0000 إلى U+FFFF'A'
stringStringمرجعنص بأي طول، غير قابل للتغيير"hello"
objectObjectمرجعأساس كل نوعnew object()

القيمة الحرفية الصحيحة بلا لاحقة من نوع int، أو أول نوع من uint وlong وulong يتّسع لها إن كانت أكبر من int، والقيمة الحرفية ذات الفاصلة العشرية من نوع double. لهذا تفشل ترجمة float f = 2.5; وdecimal d = 2.5;: القيمة الحرفية double، ولا يوجد تحويل ضمني من double إلى float أو decimal. أضف اللاحقة: 2.5f و2.5m.

يكشف كل نوع رقمي حدوده كثوابت:

المخرجات:

byte:  0 to 255
short: -32768 to 32767
int:   -2147483648 to 2147483647
long:  -9223372036854775808 to 9223372036854775807
decimal max: 79228162514264337593543950335
double max:  1.798E+308
sizes: int 4, long 8, double 8, char 2
255 161 3000000000

عمليًا تستخدم معظم الشيفرات أربعة منها: int للعدّ والفهارس، وlong للمعرّفات والمجاميع الكبيرة، وdouble للقياسات والرياضيات، وdecimal للمال.

decimal مقابل double

يخزّن double (وfloat) الأرقام بالنظام الثنائي. معظم الكسور العشرية، ومنها 0.1، ليس لها شكل ثنائي دقيق، فتُخزَّن كأقرب قيمة قابلة للتمثيل وتتراكم أخطاء صغيرة. أما decimal فيخزّن عددًا صحيحًا بالنظام العشري مع مقياس، فتكون 0.1 هي 0.1 بالضبط.

المخرجات:

False
True
0.30000000000000004
0.3
double sum == 1.0: False
decimal sum == 1.0: True
Total: 59.97
Split three ways: 19.99

استخدم decimal للمال والأسعار والضرائب وكل ما سيجمعه شخص يدويًا ويقارنه. يحتفظ بالأصفار اللاحقة من مدخلاته (1.50m تُطبع 1.50) وله 28 إلى 29 رقمًا معنويًا.

واستخدم double للقياسات الفيزيائية والإحصاء والهندسة والألعاب. هو أسرع بعدة مرات، ويستخدم نصف الذاكرة، ونطاقه هائل. لا تقارن قيمتين محسوبتين من نوع double بـ == أبدًا؛ قارن الفرق بهامش سماح: Math.Abs(x - y) < 1e-9.

decimal ليس سحرًا: 1m / 3m ما زالت 0.3333333333333333333333333333، وحساب double لا يرمي استثناءً عند القسمة على صفر (ينتج ما لا نهاية، أو NaN لـ 0.0 / 0.0)، بينما ترمي قسمة decimal والأعداد الصحيحة على صفر استثناء DivideByZeroException.

تجاوز سعة الأعداد الصحيحة وchecked

الحساب الصحيح الذي يتجاوز نطاق النوع يلتفّ افتراضيًا، بصمت. يلتقط المترجم التجاوز في التعابير الثابتة، لكن لا حين تأتي القيم من متغيّرات:

المخرجات:

-2147483648
OverflowException
-1294967296
2147483648

تحوّل checked(...) أو كتلة checked { ... } التجاوز إلى استثناء OverflowException. ويمكنك أيضًا تفعيله للمشروع كله بـ <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>. كتابة int x = int.MaxValue + 1; بالثوابت خطأ ترجمة (CS0220)، لأن المترجم يرى التجاوز.

يُظهر السطر الأخير الحل لمعظم أخطاء التجاوز: حوّل إلى نوع أوسع قبل العملية الحسابية. أما (long)(max + 1) فخطأ، لأن الجمع يكون قد التفّ حين يُنفَّذ التحويل.

أنواع القيم والأنواع المرجعية

كل نوع في C# إما نوع قيمة أو نوع مرجعي، والفرق يحدد ما يفعله الإسناد.

  • أنواع القيم: كل الأنواع الرقمية، وbool وchar وDateTime والتعدادات وكل struct. يحتوي المتغيّر على البيانات؛ والإسناد ينسخها.
  • الأنواع المرجعية: string والمصفوفات وobject وكل class. يحتوي المتغيّر على مرجع إلى كائن؛ والإسناد ينسخ المرجع، فيرى المتغيّران الكائن نفسه.

المخرجات:

a=10 b=99
first[0]=99
s1=cat s2=cats

string نوع مرجعي يتصرف عمليًا كقيمة: غير قابل للتغيير، و== تقارن النص لا المراجع. المزيد عن أنواع القيم المعرّفة من المستخدم في البنى.

char وbool

char وحدة ترميز UTF-16 واحدة، تُكتب بين علامتي اقتباس مفردتين. هو نوع رقمي في الأساس، فيتحوّل إلى int ويدعم العمليات الحسابية:

المخرجات:

66
C
True
True
7
b
True

لـ bool قيمتان بالضبط ولا يتحوّل من الأرقام أو إليها: if (count) خطأ ترجمة، لا اختبار لعدم الصفر. اكتب if (count != 0). المحارف خارج المستوى متعدد اللغات الأساسي، مثل معظم الرموز التعبيرية، تأخذ قيمتي char (زوجًا بديلًا)، لذا تعدّ Length في string وحدات UTF-16 لا المحارف المرئية.

القيم الافتراضية

تحصل الحقول وعناصر المصفوفات وdefault(T) على القيمة الافتراضية للنوع: الصفر للأرقام، وfalse لـ bool، و'\0' لـ char، وnull للأنواع المرجعية. أما المتغيّرات المحلية فلا تحصل على قيمة افتراضية ويجب الإسناد إليها قبل الاستخدام.

المخرجات:

0
0
False
True
0001-01-01
0,0,0

منذ C# 7.1 يمكنك كتابة القيمة الحرفية default دون النوع حين يستطيع المترجم استنتاجه (int x = default;). لا يمكن لنوع القيمة أن يكون null، ولهذا وُجد int? (نوع قيمة قابل لـ null)؛ راجع الأنواع القابلة لـ null.

الأعداد الصحيحة بحجم المنصة والأعداد الكبيرة

يوجد نوعان رقميان آخران لحالات خاصة. nint وnuint (C# 9) عددان صحيحان بحجم المؤشر، 32 أو 64 بت بحسب المنصة، يُستخدمان في التشغيل البيني والشيفرة منخفضة المستوى. ويحمل System.Numerics.BigInteger أعدادًا صحيحة بأي حجم، على حساب السرعة:

using System.Numerics;
BigInteger factorial = 1;
for (int i = 2; i <= 30; i++) factorial *= i;
// 265252859812191058636308480000000

الأسئلة الشائعة

ما هي أنواع البيانات في C#؟

الأنواع المدمجة هي الأعداد الصحيحة (sbyte وbyte وshort وushort وint وuint وlong وulong)، والنوعان العشريان العائمان float وdouble، وdecimal للحساب العشري الدقيق، وchar لمحرف UTF-16، وbool، والنوعان المرجعيان string وobject. كل كلمة محجوزة اسم مستعار لنوع في .NET: int هو System.Int32، وstring هو System.String.

هل أستخدم decimal أم double للمال في C#؟

استخدم decimal. يخزّن double كسورًا ثنائية، فلا يمكن تمثيل قيم مثل 0.1 بدقة وتنحرف المجاميع (0.1 + 0.2 == 0.3 تساوي false). أما decimal فيخزّن أرقامًا عشرية، ويحتفظ بـ 28 إلى 29 رقمًا معنويًا، ويعطي النتائج التي يتوقعها المحاسبون. double أسرع ونطاقه أوسع بكثير، فاستخدمه للعلوم والرسوميات والقياسات.

ما أكبر قيمة لـ int في C#؟

int.MaxValue تساوي 2,147,483,647 وint.MinValue تساوي -2,147,483,648 (عدد صحيح بإشارة من 32 بت). إضافة 1 إلى int.MaxValue تلتفّ بصمت إلى int.MinValue ما لم تعمل الشيفرة في سياق checked، حيث ترمي OverflowException. استخدم long (حتى نحو 9.2 كوينتليون) للقيم الأكبر.

ما الفرق بين float وdouble في C#؟

float من 32 بت بنحو 6 إلى 9 أرقام معنوية؛ وdouble من 64 بت بنحو 15 إلى 17. القيم الحرفية العشرية من نوع double افتراضيًا، لذا يحتاج float إلى اللاحقة f: float speed = 2.5f;. استخدم double ما لم تتطلب الذاكرة أو واجهة API (مثل Vector3 في Unity) النوع float.

ما الفرق بين أنواع القيم والأنواع المرجعية في C#؟

متغيّر نوع القيمة (int وdouble وbool وDateTime وأي struct) يحمل البيانات نفسها، والإسناد ينسخها. أما متغيّر النوع المرجعي (string والمصفوفات وأي class) فيحمل مرجعًا إلى كائن في الكومة، والإسناد ينسخ المرجع، فيمكن لمتغيّرين أن يشيرا إلى الكائن نفسه.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن