المتابعون للمدونة

الأربعاء، 13 مارس 2019

نطاق المتغيرات الموضعية

نطاق المتغيرات الموضعية
 
تعرفون أن المتغيرات المحلية Local Variables في فيجوال بيزيك وسي شارب تكون مرئية في النطاق الذي توجد فيه.. فيمكنك مثلا تعريف متغير داخل جملة شرط، ولن تستطيع استخدامه خارجها:
C#
var x = 2;
if (x > 1)
{
    var msg = "x > 2";
    Console.WriteLine(msg);
}
else
{
    var msg = "x <= 2";
    Console.WriteLine(msg);
}
تلاحظ أنك استطعت تعريف متغيرين كل منهما اسمه msg لأن كلا منهما مرئي فقط في المقطع الصغير الذي تم تعريفه فيه.
لكنك لو حاولت تعريف متغير اسمه msg بعد نهاية الجملة if..else فستحصل على خطأ لأن المتغير الثالث مرئي داخل جملة if..else لأنه معرف في المقطع الخارجي الذي يحتوي على if..else.
VB:
Dim x = 2
If x > 1 Then
    Dim msg = "x > 2" ' خطأ
    Console.WriteLine(msg)
else
    Dim msg = "x <= 2" ' خطأ
    Console.WriteLine(msg)
End If
Dim msg = "done"
Console.WriteLine(msg)
 
 قد يجعلك هذا تتعجب، لأن المتغير الثالث سيتم تعريفه بعد انتهاء جملة الشرط، وبالتالي لن يؤثر عليها.. لكن ليس هكذا تعمل لغة البرمجة.. على سبيل المثال: لو وضعت كل هذا الكود في حلقة دوران مثل Do Loop فهذا معناه أن التنفيذ سيعود لأعلى مرة أخرى وسيختبر جملة الشرط مرة أخرى، وسيحدث ارتباك بين قيمتي المتغيرين اللذين لهما نفس لاسم!
يمكنك حل هذه المشكلة في سي شارب بتعريف نطاق خاص بالمتغير الثالث، بوضعه في القوسين {}:
C#
var x = 2;
if (x > 1)
{
    var msg = "x > 2";
    Console.WriteLine(msg);
}
else
{
    var msg = "x <= 2";
    Console.WriteLine(msg);
}
 
{
    var msg = "done";
    Console.WriteLine(msg);
}
 
لا يوجد شيء مثل هذا في فيجوال بيزيك، لكن يمكن الحصول عليه بحيلة صغيرة، مثل وضع المتغير الثالث في جملة شرط صحيحة دائما:
Dim x = 2
If x > 1 Then
    Dim msg = "x > 2" ' خطأ
    Console.WriteLine(msg)
else
    Dim msg = "x <= 2" ' خطأ
    Console.WriteLine(msg)
End If
 
If True Then
   Dim msg = "done"
   Console.WriteLine(msg)
End If
أو وضعه في المقطع With بالحيلة التالية:
Witn Nothing
   Dim msg = "done"
   Console.WriteLine(msg)
End With
 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر