سؤال

في VB.NET ما الفرق بين And و AndAlso؟ما الذي يجب أن أستخدمه؟

هل كانت مفيدة؟

المحلول

ال And يقوم المشغل بتقييم كلا الجانبين، حيث AndAlso يتم تقييم الجانب الأيمن إذا وفقط إذا كان الجانب الأيسر صحيحًا.

مثال:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

ما ورد أعلاه يلقي استثناء إذا mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

هذا واحد لا يرمي استثناء.

لذا، إذا كنت قادمًا من عالم C#، فيجب عليك استخدام AndAlso كما لو كنت تستخدم &&.

مزيد من المعلومات هنا: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

نصائح أخرى

والمشغل And سوف تحقق كافة الشروط في بيان قبل المتابعة، في حين أن المشغل Andalso ستتوقف إذا كان يعرف حالة غير صحيحة. على سبيل المثال:

if x = 5 And y = 7

والشيكات إذا كان x يساوي 5، وإذا ذ يساوي 7، ثم يستمر إذا كان كلاهما صحيح.

if x = 5 AndAlso y = 7

والشيكات إذا كان x يساوي 5. إذا لم تكن كذلك، فإنه لا معرفة ما اذا كان ذ 7، لأنه يعلم أن حالة غير صحيحة بالفعل. (وهذا ما يسمى قصيرة في الدائرة).

وعموما الناس استخدام طريقة قصيرة في الدائرة إذا كان هناك سبب للصراحة لا تحقق الجزء الثاني إذا كان الجزء الأول غير صحيح، كما لو أنه رمي استثناء إذا محددا. على سبيل المثال:

If Not Object Is Nothing AndAlso Object.Load()

إذا أن And استخدامها بدلا من AndAlso، فإنه لا يزال يحاول Object.Load() حتى لو كانت nothing، التي من شأنها أن رمي استثناء.

ومن المثير للاهتمام أي من الإجابات ذكر أن And وOr في VB.NET ومشغلي قليلا في حين OrElse وAndAlso هي العوامل المنطقية بدقة.

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

ملاحظة : ليعتبر صحيحا صفر غير true. سوف Dim e = not 0 تعيين e إلى -1 يدل Not هو أيضا عامل الشيء.

و|| و&& (في C # إصدارات OrElse وAndAlso) العودة التعبير تقييم الماضي والتي سيتم 3 و5 على التوالي. هذا يتيح لك استخدام v || 5 لغة في C # لإعطاء 5 حيث بلغت قيمة التعبير عندما v هو null أو (0 وعدد صحيح) وقيمة v خلاف ذلك. الاختلاف في دلالات يمكن أن يصاب C # مبرمج تجريب في VB.NET على حين غرة حيث أن هذا "لغة القيمة الافتراضية" لا يعمل في VB.NET.

على لذلك، للإجابة على السؤال : في استخدام Or وAnd لعمليات بت (عدد صحيح أو منطقية). استخدام OrElse وAndAlso إلى "ماس كهربائى" عملية لتوفير الوقت، أو اختبار صحة التقييم قبل تقييم ذلك. If valid(evaluation) andalso evaluation then أو if not (unsafe(evaluation) orelse (not evaluation)) then

<القوي> المكافأة: ما هي قيمة ما يلي

Dim e = Not 0 And 3
If Bool1 And Bool2 Then

ويقيم كل من Bool1 وBool2

If Bool1 AndAlso Bool2 Then

ويقيم Bool2 إذا وفقط إذا Bool1 غير صحيح.

وفقط لجميع هؤلاء الناس الذين يقولون الآثار الجانبية شريرة: مكان وجود آثار جانبية اثنان في حالة واحدة أمر جيد أن تكون قراءة كائنين ملف جنبا إلى جنب

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

وباستخدام And يضمن على التوالي يستهلك في كل مرة يتم فحص حالة. في حين AndAlso قد قراءة السطر الأخير من File1 وترك File2 دون خط المستهلكة.

وبطبيعة الحال فإن رمز أعلاه لا يعمل، ولكن يمكنني استخدام آثار جانبية مثل هذا في كل وقت ولن تنظر فيه " سيئة " أو " الشر " سيكون الكود كما بعض تقودك إلى الاعتقاد. فإنه من السهل أن تقرأ وفعالة.

وهناك طريقة بسيطة للتفكير في أنه يستخدم حتى ابسط الانجليزية

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

وAndAlso هو يشبه إلى حد كبير و، إلا أنها تعمل مثل && في C #، C ++، الخ.

والفرق هو أنه إذا كان الشرط الأول (واحد من قبل AndAlso) هو الصحيح، يتم تقييم الشرط الثاني أبدا - مجمع التعبير المنطقي هو "مدارة قصيرة"

.

وهذا هو في بعض الأحيان من المفيد جدا، على سبيل المثال في تعبير مثل:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

وعن طريق القديم وفي التعبير أعلاه من شأنه أن يلقي NullReferenceException إذا كانت myObj فارغة.

وانظر أيضا مسألة تجاوز المكدس: <م> يجب دائما استخدام العوامل AndAlso وOrElse <. / P>

وأيضا: تعليق لأولئك الذين ذكروا أنهم يستخدمون And إذا كان الجانب الأيمن من التعبير له من الآثار الجانبية التي تحتاج إليها:

وإذا كان الجانب الأيمن لديه من الآثار الجانبية التي تحتاج إليها، فقط تحريكه إلى الجانب الأيسر بدلا من استخدام "و". أنت فقط بحاجة فعلا "و" إذا <م> على حد سواء الجانبين لها آثار جانبية. وإذا كان لديك أن العديد من الآثار الجانبية مستمرة تفعلونه ربما شيء آخر خطأ. بشكل عام، هل حقا ينبغي أن تفضل AndAlso.

وبالإضافة إلى الإجابات أعلاه، AndAlso يوفر عملية تكييف المعروفة باسم الدائرة القصيرة. والعديد من لغات البرمجة هذه الوظيفة التي بنيت في مثل vb.net لا، ويمكن أن توفر زيادات كبيرة الاداء في تصريحات حالة طويلة عن طريق الاستغناء عن التقييمات التي unneccessary.

وثمة شرط آخر مماثل هو الشرط OrElse التي من شأنها أن تحقق فقط حالة ملائمة إذا كان الشرط اليسرى خاطئة، وبالتالي الاستغناء عن الشيكات حالة unneccessary بعد العثور على شرط صحيح.

وأنصح لك دائما الى استخدام عمليات الدائرة القصيرة وهيكلة البيانات الشرطية الخاصة بك في الطرق التي يمكن أن يستفيد منها أكثر من ذلك. على سبيل المثال، اختبار الخاص بك أكثر كفاءة وأسرع الشروط أولا حتى يتسنى لك تشغيل فقط الظروف طويلة عندما يكون لديك على الاطلاق لوماس كهربائى في أوقات أخرى.

لغالبيتنا OrElse وAndAlso سوف تفعل خدعة عدا استثناءات قليلة مربكة (أقل من 1٪ حيث قد يكون علينا أن استخدام أو وو).

وحاول أن لا ننجرف من قبل الناس الرياء المنطق من المنطقية وجعلها تبدو وكأنها علم الصواريخ.

وانها بسيطة جدا ومباشرة إلى الأمام وأحيانا النظام قد لا تعمل كما هو متوقع لأنه لا يحب المنطق الخاص في المقام الأول. وبعد عقلك تبقي أقول لك هذا المنطق له يتم اختبار 100٪ وثبت وينبغي لها أن تعمل. في تلك اللحظة بالذات وقف الثقة الدماغ ويطلب منه التفكير مرة أخرى أو (لا OrElse أو ربما OrElse) التي تجبر نفسك على البحث عن وظيفة أخرى لا تتطلب الكثير من المنطق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top