نطاق المتغيرات الموضعية
تعرفون أن المتغيرات المحلية 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
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.