تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
If Operator من جديد VB2008
#1
كاتب الموضوع : samerselo

في البداية أحب أن أنوه أن If Operator هنا مختلف عن الوظيفة IIf أو عبارة If … Then … Else المعتادة. فسابقا عندما كنا نستخدم IIF كان النوع المعاد من النوع Object مما يعني أنه لن يحصل تدقيق على النوع بالحالة الافتراضية كما لن يتوفر IntelliSense لتلك القيمة ولهؤلاء الذين يصرون على كتابة كود آمن خلال الأنواع ومن أجل الربط المبكر للكود كان يجب عليهم تحويل ذلك النوع إلى نوع البيانات المراد فقد يبدو لديهم الكود كما يلي

كود :
Dim intC As Integer = CInt(IIf(intA = intB, intA, intB - 1))
ولكن الآن وباستخدام المعامل If يمكننا إعادة كتابة نفس الكود والحصول على فوائد الربط المبكر وتدقيق النوع وتوفر intelliSense لتلك القيمة

كود :
Dim intD As Integer = If(intA = intB, intA, intB)
الصيغة العامة
يوفر المعامل If طريقة مختصرة لإعادة قيمة واحدة من قيمتين وفق شرط معين حيث يمكن استدعاؤه بتمرير ثلاثة وسائط له أو وسيطتين وتكون الصيغة العامة له

كود :
If( [argument1,] argument2, argument3 )
استدعاء If Operator بثلاثة وسائط
عندما يتم استدعاء المعامل If بثلاثة وسائط يجب أن يمكن تقييم الوسيطة الأولى كقيمة بوليانية التي ستحدد بدورها أية واحدة من الوسيطتين الأخريين سيتم تقييمها وإعادة قيمتها وتكون الوسائط الثلاث عند استخدام المعامل If بثلاثة وسائط كما يلي:
• argumet1 ضرورية وقيمتها بوليانية وهي تحدد أية واحدة من الوسيطتين الأخريين سيتم تقييمها وإعادتها
• argumet2 ضرورية وهي من النوع Object ويتم تقييمها وإعادتها في حال كون قيمة argument1 هي True
• argument3 ضرورية وهي من النوع Object ويتم تقييمها وإعادتها في حال كون قيمة argument1 هي False
فعندما يتم استدعاء المعامل If بثلاثة وسائط يعمل بشكل مشابه للوظيفة IIf فيما عدا أنها تستخدم التقييم المختصر. فالوظيفة IIf تقيم دوما جميع الوسائط الثلاث بينما المعامل If يقوم بتقييم اثنين فقط من تلك الوسائط حيث يتم تقييم الوسيطة الأولى وتحويل نوعها إلى Boolean فإن كانت النتيجة True فسيتم تقييم argument2 ثم إعادة قيمتها ولكن لن يتم تقييم argument3 في هذه الحالة. وإن كانت قيمة الوسيطة الأولى False عندها لن يتم تقييم argument2 وسيتم تقييم argument3 وإعادة قيمتها ويوضح المثال التالي استخدام المعامل If بثلاثة وسائط

كود :
' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))
والمثال التالي يوضح قيمة التقييم المختصر مظهرا محاولتين لتقسيم متغير number على متغير divisor عدا أنه عندما تكون قيمة devisor مساوية للصفر يجب إعادة القيمة صفر ولا يجب محاولة القيام بعملية القسمة وإلا نتج عن ذلك خطأ وقت التنفيذ – خطأ القسمة على صفر - وبسبب أن المعامل If يستخدم التقييم المختصر فإنه يقيم إما الوسيطة الثانية أو الثالثة اعتمادا على قيمة الوسيطة الأولى فإن كانت للوسيطة الأولى القيمة True فيكون devisor لا يحمل القيمة صفر وبالتالي يكون آمنا تقييم الوسيطة الثانية وإجراء عملية القسمة وإن كانت قيمة الوسيطة الأولى False فسيتم تقييم الوسيطة الثالثة فقط وسيتم إعادة القيمة صفر ولهذا فعندما تكون قيمة devisor مساوية للصفر فلن يتم محاولة إجراء عملية القسمة وبالتالي لن يكون هناك خطأ في زمن التنفيذ وبما أن IIf لا تستخدم التقييم المختصر فسيتم تقييم الوسيطة الثانية دوما مهما كانت قيمة الوسيطة الأولى وبالتالي سينطلق خطأ القسمة على صفر وقت التنفيذ دوما

كود :
number = 12

' When the divisor is not 0, both If and IIf return 4.
Dim divisor = 3
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

' When the divisor is 0, IIf causes a runtime error, but If does not.
divisor = 0
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
' Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))
استدعاء If Operator بوسيطتين
يمكن حذف الوسيطة الأولى مما يمكنك من استدعاء المعامل If بوسيطتين حيث تكونان كما يلي
• argument2 ضرورية من النوع Object ويجب أن تكون من نوع يمكن أن يحمل القيمة Nothing أو نوع مرجعي Reference or nullable type حيث يتم تقييمه وإعادته عندما يحمل أي قيمة مغايرة لـ Nothing
• argument3 ضرورية من النوع Object حيث يتم تقييمها وإعادة قيمتها في حالة كون قيمة argument2 مساوية لـ Nothing
فعندما يتم حذف الوسيطة البوليانية عندها يجب أن تكون الوسيطة الأولى من نوع يقبل أن يحمل القيمة Nothing أو نوع مرجعي reference or nullable type فإن تم تقييم الوسيطة الأولى إلى Nothing عندها يتم إعادة قيمة الوسيطة الثانية وفي جميع الحالات الأخرى يتم إعادة قيمة الوسيطة الأولى كما يظهر المثال التالي

كود :
' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم