У 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 з першим "помилковим" в умовах він перевірить наступний, щоб у вас не виникло помилок.