الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

توضيح إضافي عن عملية ال Casting

مغلق
بدأه mqmmss في 25 مايو 2007 · 2 رد · 1,067 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخواني نحن نعرف بأنه إذا أراد أحدنا التحويل من نوع متغير أصغر إلى نوع متغير أكبر فهنا لن يكون هنالك أي مشكلة تذكر .

بينا إذا أردنا التحويل من نوع متغير أكبر إلى نوع متغير أصغر فإنه لا مفر من أن نستخدم عملية التحويل ( cast) إلى النوع الأصغر .. وهذا ما تعود عليه كل مبرمجي لغة JAVA .

ولكن لو لا حضنا الكود التالي :

			double x = 52.2;
			byte y = (Byte)x;
			MessageBox.Show(Convert.ToString(y));

في المثال السابق علينا أن نلاحظ بأن قيمة المتغير x هي قيمة عشرية ولكنها تقل عن القيمة القصوي ( Max Value ) التي يمكن تخزينها في المتغير yوالذي هو بالأصل من النوع Byte .

لذا سنجد بأن قيمة المتغير y بعد عملية الـ cast قد أصبحت تساوي الجزء الصحيح فقط وهو الرقم 52 .

الأن ماذا لو قمنا بإعطاء المتغير x قيمة تزيد عن القيمة القصوى التي يمكن تخزينها في المتغير من النوع Byte ( أي قيمة تزيد عن 255 ) .

دعونا نجرب الكود التالي :

			double x = 300;
			byte y = (Byte)x;
			MessageBox.Show(Convert.ToString(y));

هنا نلاحظ بأننا أعطينا المتغير x قيمة أكبر من القيمة التي يمكن تخزينها في المتغير y والذي هو من النوع Byte ( أي القيمة 300 تزيد عن القيمة المسموح بها في المتغيرات من النوع Byte ) وهذه الزيادة هي بمقدار 44 .

يعني ( 300-256=44 ) .

ولو نفذنا الشفرة السابقة سنجد بأن الناتج سوف يكون ============= 44 .

من هنا نفهم بأن هذا هو الوظيفة الأصلية لعملية الـ casting .

وهي التحويل إلى النوع الأقل .. ولكن إذا كانت القيمة أقل من القيمة القصوي فيت تجاهل العدد الكسري فقط ( من بعد الفاصلة العشرية ) , أما لو كان أكبر من القيمة القصوي فيتم الأخذ بالفارق ..

يعني لو كان في مثالنا

قيمة المتغير x هي 1250.65

فإننا سنجد بأن قيمة المتغير y سوف تكون تساوي 226

وهذه القيمة هي الفترق ما بين الرقمين التاليين :

256 * 4 = 1024

والرقم الذي هو عندنا ( 1250.65 )

لذا فالفارق بينهم كما يلي :

1250.65 - 1024 = 226

وهو المطلوب إثباتة :P ( # ) :P

بالتوفيق للجميع

تم تعديل هذه المشاركة بواسطة mqmmss في 25 مايو 2007 في 18:52

#2

بارك الله فيك أخي الكريم

واسمح لي ان اضيف قليلا لما كتبت

ان عملية فحص اذا كان تم تجاوز الحد الأعلى الذي يمكن تخزينه ضمن المتغير هي عملية ذات عبء اضافي لذلك للتخفيف من هذا العبء يحدث ما ذكرته في مقالك

ولكن في بعض الحالات قد لا يعجبك هذا التصرف اي تريد فحص اذا تم التجاوز بحيث اذا خزنت في المتغير قيمة تتجاوز الحد الأعظمي له تريد رمي استثناء او ما يسمى بالأكسبشن

ليتم عمل تصرف أخر كإظهار رسالة للمستخدم

وهذا يتم باحدى طريقتين - انا شخصيا افضل الطريقة الثانية -

الطريقة الأولى :

اختر القائمة

project

ثم

y(your project name) Properties

ثم انقر على التبويب

Build

ثم من الزاوية السفلية اختر

advanced

ثم اختر او الغي اختيار مربع الاختيار :

Check for arthmetic overflow/underflow

الطريقة الثانية :

في بعض الحالات قد تريد ان يتم رمي الاكسبشن اذا تجاوزت الحد الأعلى للتخزين ضمن المتغير وفي حالات اخرى لا تريد هذا التصرف

لذلك يمكنك استخدام الكلمتين الاساسيتين :

Checked/UnChecked

بحيث يتم الفحص او عدم الفحص بغض النظر عن الاعدادات التي قمنا بها في الخطوة الأولى

مثال :

 


uint Number1 = uint.MaxValue;
uint Number2 = uint.MaxValue;
try
{
unchecked
{
Number2++;
Console.WriteLine(Number2.ToString());
}
checked
{
Number1++;
Console.WriteLine(Number1.ToString());
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}

اما الاظهارات على الشاشة فهي :

بلنسبة للمتغير رقم واحد فإن تم التدوير لقيمته لتبح صفر دون رمي الأكسبشن

بالنسبة للمتغير رقم اثنين تم رمي الاكسبشن وظهرت الرسالة التالية :

Arithmetic operation resulted in an overflow.

دمتم بحفظ الله ورعايته

تم تعديل هذه المشاركة بواسطة sa3di86 في 11 فبراير 2008 في 16:31

#3

تسلم ايدكم يا رجاله

والف شكر على الموضوع

هذا الموضوع مغلق.

مواضيع مشابهة