У VB.NET, в чому різниця між Andі AndAlso? Який я повинен використовувати?
У 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/
Thenце власне ключове слово.
AndОператор перевірить всі умови в заяві , перш ніж продовжити, в той час як оператор AndAlso зупиниться , якщо він знає , що умова помилкова. Наприклад:
if x = 5 And y = 7
Перевіряє, чи х дорівнює 5, а якщо y дорівнює 7, то продовжується, якщо обидва є істинними.
if x = 5 AndAlso y = 7
Перевіряє, чи x дорівнює 5. Якщо це не так, він не перевіряє, чи y дорівнює 7, тому що знає, що умова вже помилкова. (Це називається коротке замикання.)
Як правило, люди використовують метод короткого замикання, якщо є причина, щоб явно не перевірити другу частину, якщо перша частина не відповідає дійсності, наприклад, якщо вона би викинула виняток, якщо це встановлено. Наприклад:
If Not Object Is Nothing AndAlso Object.Load()
Якщо це використовувати Andзамість AndAlso, воно все одно намагатиметься, Object.Load()навіть якби це було nothing, що б кинуло виняток.
and/ orякщо тільки у них немає причини - з яких я вважаю, що законних мало і далеко між ними. Звичайно, у більшості інших мов коротке замикання за замовчуванням є причина: вона зберігає сенс результату, не оцінюючи потенційно дорогі вирази, коли вони нічого не вносять. Зберігання побічних ефектів в умовах повинно бути, добре, оком. Але це лише моя думка ...
Цікаво, що жоден з відповідей не згадував, що 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
||і &&з ??. Хоча є мови, де ||повертається значення, яке не стосується фальси, C # не є однією з них, і повертає a bool(за винятком піднятих операторів, що зволікають, де ви отримуєте Nullable<bool>результат)
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? .
Також: коментар для тих, хто згадав про використання, Andякщо права частина виразу має побічну дію:
Якщо правий бік має потрібний вам побічний ефект, просто перемістіть його в ліву частину, а не використовуючи "І". Вам потрібне дійсно лише "І", якщо обидві сторони мають побічні ефекти. І якщо у вас так багато побічних ефектів, ви, ймовірно, робите щось інше не так. Загалом, вам справді слід віддати перевагу AndAlso.
На додаток до вищезазначених відповідей, AndAlso забезпечує процес кондиціонування, відомий як коротке замикання. У багатьох мовах програмування вбудована така функціональність, як і vb.net, і вони можуть забезпечити значне підвищення продуктивності у твердженнях про тривалий стан, вирізавши непотрібні оцінки.
Іншою подібною умовою є умова OrElse, яка перевірятиме правильну умову лише у тому випадку, коли ліва умова є помилковою, таким чином вирізаючи непотрібні перевірки стану після виявлення справжньої умови.
Я б радив вам завжди використовувати процеси короткого замикання та структурувати свої умовні висловлювання таким чином, щоб цим виграли найбільше користі. Наприклад, спершу випробуйте свої найефективніші та найшвидші умови, щоб ви запускали свої довгі умови лише тоді, коли вам зовсім доведеться та коротко замикаєтесь в інші рази.
Для більшості з нас OrElse та AndAlso виконають трюк, за винятком кількох заплутаних винятків (менше 1%, коли нам, можливо, доведеться використовувати Or і And).
Постарайтеся не захоплюватися людьми, демонструючи свою булеву логіку і роблячи це схожим на ракетну науку.
Це досить просто і прямо вперед, і час від часу ваша система може працювати не так, як очікувалося, оскільки вона в першу чергу не подобається вашій логіці. І все-таки ваш мозок постійно говорить вам, що його логіка перевірена і перевірена на 100%, і вона повинна працювати. У той самий момент перестаньте довіряти своєму мозку і попросіть його подумати ще раз (чи не OrElse чи, можливо, OrElse), ви змусите себе шукати іншу роботу, яка не потребує особливої логіки.
Використовуйте випадок: за
допомогою "І" компілятор перевірить усі умови, тому якщо ви перевіряєте, чи може об'єкт бути "Нічого", а потім ви перевіряєте одну з його властивостей, ви будете мати помилку часу запуску.
Але з AndAlso з першим "помилковим" в умовах він перевірить наступний, щоб у вас не виникло помилок.