الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

If Operator

مغلق
بدأه محمد سامر أبو سلو في 7 ديسمبر 2007 · 12 رد · 2,792 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في البداية أحب أن أنوه أن 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))

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

شكرا

#3

السلام عليكم

اشكر الاح محمد على هذا الدرس الجميل , و اود ان اضيف - بعد اذن الاخ محمد- ان If Operator موجود ايضا فى فى VB2005

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#4
hanysaad كتب:
السلام عليكم

اشكر الاح محمد على هذا الدرس الجميل , و اود ان اضيف - بعد اذن الاخ محمد- ان If Operator موجود ايضا فى فى VB2005

أخ هاني بعد إذنك

If Operator بالصورة المشروحة هنا غير موجود في Vb 2005

الموجود في الـ 2005 حلقة If ... Then ... Else التقليدية والوظيفة IIF وليس If Operator المشروح هنا - يرجى التأكد

وقد قمت بتوضيح الفرق بين الوظيفة IIf الموجودة في الاصدارات ما قبل 2008 و IF Operator القادم كجديد مع 2008

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 7 يناير 2008 في 23:46

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

السلام عليكم

اخى العزيز محمد

انا اقصد ان IIf Operator , هيا للى موجودة فى 2005

If ... Then ... Else التقليدية , طبيعى موجودة فى كل اصدرات الدوت نت

لكن انا اقصد IIf Operator , وانا اشتغلت بيها فعلا على فى بى 2005 ,,,

تم تعديل هذه المشاركة بواسطة hanysaad في 7 يناير 2008 في 23:53

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#6
hanysaad كتب:
السلام عليكم

اخى العزيز محمد

انا اقصد ان IIf Operator , هيا للى موجودة فى 2005

If ... Then ... Else التقليدية , طبيعى موجودة فى كل اصدرات الدوت نت

لكن انا اقصد IIf Operator , وانا اشتغلت بيها فعلا على فى بى 2005 ,,,

تمام أخي أنت محق 100% فاستدعاء If Operator بثلاثة وسائط مماثل تماما لاستخدام IIf التي نعرفها حتى من الاصدارات ما قبل 2005 إلا أنها هنا تستخدم التقييم المختصر مثل AndAlso أو OrElse

لاحظ في الـ 2008 الجديد If بحرف I واحد فقط وليس IIf القديمة بحرفين I

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 7 يناير 2008 في 23:53

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#7

اه , تمام , فهمت قصدك

انا اسف انا ماركزتش قوى فى قراءة الموضوع ...

انا فعلا كنت اقصد IIF , وليس IF Operator الذى تفضلت بشرحه هنا ,,,

تم تعديل هذه المشاركة بواسطة hanysaad في 7 يناير 2008 في 23:58

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#8

بل الشكر لك أخ هاني

فاختلاط الأمر عليك أفاد في مزيد من توضيح نقطة التشابه بين IIF و If Operator وأيضا الاختلاف بينهما فحتى أنا أصبت ببعض الارتباك عند قراءتي للموضوع أول مرة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#9

السلام عليكم ,,

أول مرة أعرف أنه يوجد في vb.net مثل هذا المعامل :hmm:

هذا المعامل موجود في ++C/C و كمثال عليه :

x = a > b ? a : b;

هذا يعتبر كبديل للـ max function ,,

و لكن صراحة أهنئ مبرمجي الـ vb.net على الـ syntax الرائع :D

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 8 يناير 2008 في 00:06

#10
اقتباس
أول مرة أعرف أنه يوجد في vb.net مثل هذا المعامل

انا عارف فعلا انها موجودة فى ال C and C++

انا بعد ما عرفت C++ , حسيت فعلا ان حاجات كتير من الدوت نت لها اصول من ال C++ , C , مع بعض التحسينات وخصوصا فى ال Syntax

مثلا : ال Delegates فى الدوت نت , هيا ال Pointer to Function فى ال C++,C

و ال Generics فى الدوت نت , هيا ال Templates فى ال C++

ووووووووو

فعلا ال C++,C هما الاصل , ولكن يبقى التفوق فى ال Syntax and Reliability للدوت نت :P

تم تعديل هذه المشاركة بواسطة hanysaad في 8 يناير 2008 في 00:15

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#11

أكيد يا هاني ما كله من عندنا :P

بس والله أنا ناوي أنقل القسم عندكم خلال سنة :D لأني مليت من الـ command line :wacko:

على كل حال أنا متابع مقالات الأخ محمد و عجبني مقال الـ Object Initializers لأنه في ++C قليل اللي بيفهمو الفرق بين الـ initialization و الـ assignment , و صراحة الله يرحم vb6 :D

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 8 يناير 2008 في 00:50

#12
اقتباس
بس والله أنا ناوي أنقل القسم عندكم خلال سنة لأني مليت من الـ command line

تمام , بس سنة كتييييييييير :lol:

اقتباس
لأنه في ++C قليل اللي بيفهمو الفرق بين الـ initialization و الـ assignment

بصراحة فى ال C++ , انا باحس ان ال Object Orientd معقد شوية , ويسبب الارتباك فعلا من غير داعى :P ...

اقتباس
و صراحة الله يرحم vb6

ايه اللى دخل ال VB6 فى الموضوع بقى :hmm: ؟؟؟

ماله الفى بى 6 :angry: ؟؟؟

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#13

أهلين هاني,,

و الله أنا مفكر أنقل خلال سنة, مع ابقاء ++C على الدكة :lol:

السبب طبعاً أنه عملت برامج لها أفكار كثير بس للأسف حتى الآن ما أعرف أشتغل إلا على المكتبات القياسية إضافة لبعض المكتبات الأخرى, طبعاً ما عندي خبرة بتصميم الواجهات أبداً لأني دائماً أسحب على الكتب من أول عشر صفحات :mellow:

الظاهر انه تصميم الواجهات في ++C يحتاج إلى جهد أكثر من البرنامج نفسه !!

أنا بدأت بالـ vb و شكلي راح أرجع للـ vb أو الـ #C إذا ربنا وفقنا, خصوصاً اني متحمس للـ net framework. بشكل كبير :cash: ,,

تحياتي هاني ,,

هذا الموضوع مغلق.

مواضيع مشابهة