01-10-12, 05:56 PM
كاتب الموضوع : samerselo
في البداية أحب أن أنوه أن If Operator هنا مختلف عن الوظيفة IIf أو عبارة If … Then … Else المعتادة. فسابقا عندما كنا نستخدم IIF كان النوع المعاد من النوع Object مما يعني أنه لن يحصل تدقيق على النوع بالحالة الافتراضية كما لن يتوفر IntelliSense لتلك القيمة ولهؤلاء الذين يصرون على كتابة كود آمن خلال الأنواع ومن أجل الربط المبكر للكود كان يجب عليهم تحويل ذلك النوع إلى نوع البيانات المراد فقد يبدو لديهم الكود كما يليكود :
Dim intC As Integer = CInt(IIf(intA = intB, intA, intB - 1))
كود :
Dim intD As Integer = If(intA = intB, intA, intB)
يوفر المعامل If طريقة مختصرة لإعادة قيمة واحدة من قيمتين وفق شرط معين حيث يمكن استدعاؤه بتمرير ثلاثة وسائط له أو وسيطتين وتكون الصيغة العامة له
كود :
If( [argument1,] argument2, argument3 )
عندما يتم استدعاء المعامل 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 = 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 بوسيطتين حيث تكونان كما يلي
• 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))