التحويلات الضمنية والصريحة
حوّلوا بأمان بين الأنواع المتوافقة
التحويلات الضمنية والصريحة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
التحويل بين الأنواع
يمكن لـ C# تحويل نوع عددي إلى نوع عددي آخر. تحدث بعض التحويلات تلقائيًا (التحويلات الضمنية)، بينما يتطلب بعضها الآخر تحويلًا صريحًا.
using System;
class Program
{
static void Main()
{
int i = 10;
double d = i; // implicit
int back = (int)d; // explicit
Console.WriteLine(d + ", " + back);
}
}التحويلات الضمنية (التوسيع)
يُسمح بـ التحويل الضمني عندما لا يمكن فقدان أي بيانات، مثل التحويل من int إلى long أو من int إلى double. ولا حاجة إلى كتابة تحويل صريح.
using System;
class Program
{
static void Main()
{
int i = 42;
long l = i; // widening, safe
double d = i; // widening, safe
Console.WriteLine(l + ", " + d);
}
}لماذا يكون التوسيع آمنًا؟
يستطيع النوع الهدف تمثيل كل قيمة من قيم النوع المصدر، ولذلك يسمح المترجم بالتحويل تلقائيًا.
using System;
class Program
{
static void Main()
{
byte b = 200;
int i = b; // byte fits in int
Console.WriteLine("byte " + b + " -> int " + i);
}
}التحويلات الصريحة (التضييق)
يلزم إجراء تحويل صريح عندما تكون البيانات عرضة للفقدان، مثل التحويل من double إلى int. وتكتبون (int)value.
using System;
class Program
{
static void Main()
{
double d = 9.78;
int i = (int)d; // truncates toward zero -> 9
Console.WriteLine(i);
}
}يقتطع التحويل ولا يقرّب
يؤدي تحويل قيمة عشرية إلى عدد صحيح إلى حذف الجزء الكسري، ولا يقرّب القيمة. استخدموا Math.Round أولًا إذا كنتم تريدون التقريب.
using System;
class Program
{
static void Main()
{
double d = 7.99;
Console.WriteLine("Cast: " + (int)d);
Console.WriteLine("Round: " + (int)Math.Round(d));
}
}تجاوز السعة عند التضييق
إذا لم تتسع القيمة داخل النوع الهدف، فقد يؤدي التحويل العادي إلى التفاف القيمة بصمت. ضعوا التحويل داخل checked لطرح استثناء عند تجاوز السعة بدلًا من ذلك.
using System;
class Program
{
static void Main()
{
int big = 300;
byte wrapped = (byte)big; // 300 wraps to 44
Console.WriteLine("Wrapped: " + wrapped);
try
{
byte safe = checked((byte)big);
Console.WriteLine(safe);
}
catch (OverflowException)
{
Console.WriteLine("checked caught overflow");
}
}
}فقدان الدقة
حتى بعض تحويلات التوسيع، مثل تحويل قيمة long كبيرة جدًا إلى float، قد تفقد الدقة رغم بقائها تحويلات ضمنية.
using System;
class Program
{
static void Main()
{
long big = 9007199254740993L;
double approx = big; // implicit, may lose precision
Console.WriteLine("long: " + big);
Console.WriteLine("double: " + approx.ToString("F0"));
}
}تحويلات char والأنواع العددية
يُحوَّل char ضمنيًا إلى رمزه العددي، ويمكنكم إجراء تحويل صريح لعدد إلى char مرة أخرى.
using System;
class Program
{
static void Main()
{
char c = 'A';
int code = c; // implicit -> 65
char next = (char)(code + 1); // explicit -> B
Console.WriteLine(code + " -> " + next);
}
}التحويلات داخل التعبيرات
في العمليات الحسابية التي تجمع أنواعًا مختلفة، تُرقّى الأنواع الأصغر تلقائيًا إلى النوع الأكبر قبل تنفيذ العملية.
using System;
class Program
{
static void Main()
{
int a = 7;
double b = 2;
double result = a / b; // a promoted to double -> 3.5
Console.WriteLine(result);
}
}مشكلة القسمة الصحيحة
إذا كان المعاملان عددين صحيحين، فستكون القسمة قسمة صحيحة. أجروا تحويلًا لأحدهما إلى double أولًا للحصول على نتيجة كسرية.
using System;
class Program
{
static void Main()
{
int a = 7, b = 2;
Console.WriteLine("int / int: " + (a / b));
Console.WriteLine("with cast: " + ((double)a / b));
}
}جمع المفاهيم
فضّلوا التحويلات الضمنية عندما تكون آمنة، واستخدموا التحويلات الصريحة عند التضييق، وانتبهوا إلى الاقتطاع وتجاوز السعة والقسمة الصحيحة.
using System;
class Program
{
static void Main()
{
int total = 17, count = 5;
double average = (double)total / count; // cast to avoid integer division
int rounded = (int)Math.Round(average);
Console.WriteLine("avg=" + average + ", rounded=" + rounded);
}
}اختبار سريع
اختبروا مدى فهمكم للتحويلات.
مراجعة
تحدث التحويلات الضمنية (تحويلات التوسيع) تلقائيًا عندما لا تُفقد أي بيانات (من int إلى long ومن int إلى double). أما التحويلات الصريحة (تحويلات التضييق) فتتطلب تحويلًا مثل (int)x، وقد تؤدي إلى الاقتطاع أو تجاوز السعة. استخدموا checked لاكتشاف تجاوز السعة، وأجروا تحويلًا إلى double لتجنّب القسمة الصحيحة.
using System;
class Program
{
static void Main()
{
double d = 3.9;
int i = (int)d; // explicit, truncates to 3
long l = i; // implicit widening
Console.WriteLine(i + ", " + l);
}
}الأسئلة الشائعة
هل درس «التحويلات الضمنية والصريحة» مجاني؟
نعم — نص درس «التحويلات الضمنية والصريحة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحويلات الضمنية والصريحة»؟
حوّلوا بأمان بين الأنواع المتوافقة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التحويلات الضمنية والصريحة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنواع القيم مقابل أنواع المراجع
- التغليف وفك التغليف
- التحويلات الضمنية والصريحة
- الفئة Convert والتحليل