09-14-2007, 10:33 PM
التحويل العلني - Explicit Conversion - دروس سى شارب C# - دروس السى شارب C#
التحويل العلني- Explicit Conversion
<!-------------------><!--مقطع البدايه----->
<!--------------------><!--الخبر الرئيسي----->
int a;
byte val1;
byte val1;
short val2;
val2=257;
val1=checked((byte) val2);
Console.WriteLine("val1 = {0}", val1);
Console.WriteLine("varl = {0}", val2);
التحويل العلني - Explicit Conversion - دروس سى شارب C# - دروس السى شارب C#
التحويل العلني- Explicit Conversion
<!-------------------><!--مقطع البدايه----->
<!--------------------><!--الخبر الرئيسي----->
التحويل العلني-
Explicit Conversion
Explicit Conversion
في الدرس السابق تعرفنا على أول طريقة من طرق تحويل الأنواع، وهي طريقة التحويل الضمني، وذكرنا بأنه يستخدم لتحويل المتغير إلى نوع يحتاج لمساحة تخزينية أكبر مما هو عليه!
أما في النوع الثاني الذي سنتعرف عليه في هذا الدرس، فيستخدم للتحويل إلى نوع يحتاج لمساحة تخزينية أقل مما هو عليه! ولكن بشرط أن يكون حجم المتغير مناسب للمساحة الجديدة. ومثال الكتاب في الدرس السابق يوضح فكرة هذه الطريقة جيداً.
من الجدولين 1 و 2 في درس أنواع البيانات، نجد أن المساحة التخزينية المتاحة لمتغير من النوع
int
هي 2 بايت، ويشمل هذا جميع الأعداد الصحيحة
2147483648-
وحتى 2147483647 ولمتغير من النوع
long
هي 4 بايت ويشمل هذا جميع الأعداد الصحيحة من 9223372036854775808
-
وحتى 9223372036854775807.
int
هي 2 بايت، ويشمل هذا جميع الأعداد الصحيحة
2147483648-
وحتى 2147483647 ولمتغير من النوع
long
هي 4 بايت ويشمل هذا جميع الأعداد الصحيحة من 9223372036854775808
-
وحتى 9223372036854775807.
وهذا يؤكد إمكانية تحويل أي متغير
long
إلى
int
ولكن بشرط أن تكون قيمة المتغير
long
ضمن نطاق المتغير
int
. ولكن التحويل هنا علني أي يحتاج لكتابة كود إضافي كما في المثال التالي:
long
إلى
int
ولكن بشرط أن تكون قيمة المتغير
long
ضمن نطاق المتغير
int
. ولكن التحويل هنا علني أي يحتاج لكتابة كود إضافي كما في المثال التالي:
int a;
long b;
b=20;
a=(int) b;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
هذا المثال عكس المثال السابق، فقد حولنا من
long
إلى
int
، وذلك بنقل القيمة الموجودة في المتغير
b
من النوع
long
إلى المتغير
a
من النوع
int
، وهذا ممكن حيث أن القيمة 20 موجودة ضمن نطاق النوعين
long
و
int
، ويتم ذلك بكتابة نوع المتغير الذي نريد التحويل إليه بين قوسين كما هو موضح أعلاه.
long
إلى
int
، وذلك بنقل القيمة الموجودة في المتغير
b
من النوع
long
إلى المتغير
a
من النوع
int
، وهذا ممكن حيث أن القيمة 20 موجودة ضمن نطاق النوعين
long
و
int
، ويتم ذلك بكتابة نوع المتغير الذي نريد التحويل إليه بين قوسين كما هو موضح أعلاه.
هذا في حال أن القيمة موجودة ضمن نطاقي المتغيرين، ولكن ماذا لو كانت القيمة أكبر من نطاق المتغير الذي نود التحويل إليه؟
كأن نحول من النوع
short
(مساحته التخزينية 2 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 32768- إلى 32767) إلى النوع
byte
(مساحته التخزينية 1 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 0 إلى 255) وذلك بنقل القيمة 257 من متغير نوعه
short
إلى متغير نوعه
byte
؟
short
(مساحته التخزينية 2 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 32768- إلى 32767) إلى النوع
byte
(مساحته التخزينية 1 بايت ويشمل هذا أي عدد صحيح ضمن النطاق من 0 إلى 255) وذلك بنقل القيمة 257 من متغير نوعه
short
إلى متغير نوعه
byte
؟
طبّق معنا هذا المثال لنرى النتيجة:
byte val1;
short val2;
val2=257;
val1= (byte) val2;
Console.WriteLine("val1 = {0}", val1);
Console.WriteLine("varl = {0}", val2);
لاحظ أن النتيجة ستظهر كالتالي:

نلاحظ أن القيمة قد تغيرت بعد نقلها إلى المتغير
val1
، أي بعد تحويلها من النوع
short
إلى النوع
byte
، ومن البديهي أن يحصل مثل هذا الأمر، والذي يعتبر من خطأ المبرمج وليس خطأ الكومبيوتر!
val1
، أي بعد تحويلها من النوع
short
إلى النوع
byte
، ومن البديهي أن يحصل مثل هذا الأمر، والذي يعتبر من خطأ المبرمج وليس خطأ الكومبيوتر!
فكما عرفنا أن الكومبيوتر يحتفظ بالبيانات في صورتها الرقمية، أي في صورة سلسة من 0 أو 1 والتي يتم تخزين كل منها في خانة عشرية
bit
.
bit
.
والنوع
byte
يحجز مساحة قدرها 1 بايت أي 8 خانات عشرية (1 بايت = 8 خانات عشرية) لتخزين قيمة المتغير من النوع
byte
فيها، بينما النوع
short
فيحجز مساحة قدرها 2 بايت أي 16 خانة عشرية لتخزين قيمة المتغير من النوع
short
فيها.
byte
يحجز مساحة قدرها 1 بايت أي 8 خانات عشرية (1 بايت = 8 خانات عشرية) لتخزين قيمة المتغير من النوع
byte
فيها، بينما النوع
short
فيحجز مساحة قدرها 2 بايت أي 16 خانة عشرية لتخزين قيمة المتغير من النوع
short
فيها.
المساحة التخزينية المحجوزة للمتغير
val1
val1
من النوع
byte
byte
المساحة التخزينية المحجوزة للمتغير
val
2
val
2
من النوع
short
short
في المثال السابق، قمنا بتخزين القيمة 257 في المتغير
val2
وهو من النوع
short
وتم تخزينه كما يلي في ذاكرة الكومبيوتر:
val2
وهو من النوع
short
وتم تخزينه كما يلي في ذاكرة الكومبيوتر:
وعند نقل هذه القيمة إلى المتغير
val1
وهو من النوع
byte
يتم تخزين البيانات بدءً من اليمين إلى اليسار وحتى 8 خانات فقط وهي المساحة التخزينية المتاحة لهذا النوع! كالتالي:
val1
وهو من النوع
byte
يتم تخزين البيانات بدءً من اليمين إلى اليسار وحتى 8 خانات فقط وهي المساحة التخزينية المتاحة لهذا النوع! كالتالي:
وهذه القيمة الثنائية مساوية للواحد، ولهذا فالنتيجة ظهرت مساوية للواحد بعد نقل القيمة للمتغير
val1
في المثال السابق.
val1
في المثال السابق.
هذا الأمر قد يسبب مشاكل في البرنامج، إذا لم ينتبه المبرمج لذلك أثناء البرمجة!
وأفضل طريقة لتجنب حدوث مثل هذا الأمر من دون انتباه المبرمج، هي إضافة الأمر التالي لتنبيه المستخدم برسالة خطأ إذا انتقلت القيمة بصورة غير كاملة إلى متغير ذو مساحة تخزينية أقل من احتياجه. وهناك طريقتين لذلك؛ كتابة كود إضافي، أو بتفعيل هذه الخاصية ضمن بيئة الدوت نت.
الطريقة الأولى:
checked(expression);
أو العبارة التالية لعدم التنبيه:
unchecked(expression);
وهذا المثال السابق بعد استخدام أمر التحقق من أن المتغير الجديد مناسب للقيمة المنقولة إليه:
byte val1;
short val2;
val2=257;
val1=checked((byte) val2);
Console.WriteLine("val1 = {0}", val1);
Console.WriteLine("varl = {0}", val2);
بعد تنفيذ هذا الكود ستظهر رسالة الخطأ التالية:

والطريقة الأخرى كما ذكرنا ضمن بيئة
VS.NET
تجعل المترجم ينبه المبرمج عن هذا الخطأ دون الحاجة لكتابة الأمر السابق، وذلك بالنقر على اسم المشروع في نافذة
Window Explorer
بالزر الأيمن، وأختيار
Properities
، لتظهر نافذة جديدة، اختر
Configuration Properties
من القائمة الموجودة على يسار هذه النافذة، ثم أختر
build.
ثم من القائمة الموجودة على يمين هذه النافذة غير في خصائص الخاصية
Check for Arithmetic Overflow/Underflow
واجعلها
True
كما هو موضح في الشكل التالي:
VS.NET
تجعل المترجم ينبه المبرمج عن هذا الخطأ دون الحاجة لكتابة الأمر السابق، وذلك بالنقر على اسم المشروع في نافذة
Window Explorer
بالزر الأيمن، وأختيار
Properities
، لتظهر نافذة جديدة، اختر
Configuration Properties
من القائمة الموجودة على يسار هذه النافذة، ثم أختر
build.
ثم من القائمة الموجودة على يمين هذه النافذة غير في خصائص الخاصية
Check for Arithmetic Overflow/Underflow
واجعلها
True
كما هو موضح في الشكل التالي:
التحويل العلني - Explicit Conversion - دروس سى شارب C# - دروس السى شارب C#