Яка різниця між And та AndAlso у VB.NET?


Відповіді:


380

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/


2
Посилання "Більше інформації" порушено. Ось нова URL-адреса: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
Хтось знає, чому вони не вибрали "AndThen" замість цього? Я думаю, це було б більш інтуїтивно.
tmighty

7
Я завжди думав, що це протилежно інтуїтивно. І також має на увазі, що збирається перевірити і те, і інше! Отже, чому я маю приїхати до ТА, щоб перевірити такі речі (так, я - ак # хлопець). Вам також ніколи не доведеться задавати питання типу "різниця між And та AndAlso". Занадто багато анс! Мій учитель англійської мови вбив би мене
Робін французької

3
Щоразу, коли я використовую OrElse, я завжди думаю про South Park "Або ще що?" "Рівно"
Робін Френч

1
@tmighty здогадується, що це спричинить більше плутанини, оскільки Thenце власне ключове слово.
бінкі

29

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, що б кинуло виняток.


14
Якщо правий бік має потрібний вам побічний ефект, просто перемістіть його в ліву частину, а не використовуючи "І". Вам потрібне дійсно лише "І", якщо обидві сторони мають побічні ефекти. І якщо у вас так багато побічних ефектів, ви, ймовірно, робите щось інше не так.
Joel Coehoorn

1
По-перше, Andalso в основному не використовується, щоб "заощадити на роботі", це нерозумно. По-друге, мати другий аргумент на користь «побічного ефекту» - це погана практика.
Tor Haugen

2
Ви не можете стверджувати, що це не економить на час виконання. І я виявив ситуації, коли побічні ефекти насправді, а не потворна погана практика.
Ед Марті

1
"В основному люди використовують метод короткого замикання, якщо є причина, щоб явно не перевірити другу частину" Ем, але? Я сподіваюся, що люди використовують коротке замикання, якщо у них немає причин цього не робити! Ніхто не повинен використовувати старі and/ orякщо тільки у них немає причини - з яких я вважаю, що законних мало і далеко між ними. Звичайно, у більшості інших мов коротке замикання за замовчуванням є причина: вона зберігає сенс результату, не оцінюючи потенційно дорогі вирази, коли вони нічого не вносять. Зберігання побічних ефектів в умовах повинно бути, добре, оком. Але це лише моя думка ...
підкреслюю

20

Цікаво, що жоден з відповідей не згадував, що 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>результат)
Ben Voigt

14
If Bool1 And Bool2 Then

Оцінює як Bool1, так і Bool2

If Bool1 AndAlso Bool2 Then

Оцінює Bool2, якщо і лише тоді, коли Bool1 є істинним.


13

Просто для всіх людей, які кажуть, що побічні ефекти є злими: добре, якщо мати два побічні ефекти в одному стані - це добре читати два файлові об’єкти в тандемі.

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

Використання Andгарантує, що рядок споживається кожного разу, коли перевіряється умова. Тоді як AndAlsoможна прочитати останній рядок File1і залишити File2без спожитого рядка.

Звичайно, наведений вище код не працює, але я постійно використовую такі побічні ефекти, і я не вважаю це « поганим » чи « злим » кодом, як деякі змусять вас повірити. Це легко читати та ефективно.


5

Простий спосіб подумати про це - використовувати ще простішу англійську мову

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


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

3
Англійська мова більше заплутана, ніж код, тому що у неї немає специфікації!
бінкі

5

AndAlso дуже схожий на І, за винятком того, що він працює як && у C #, C ++ тощо.

Різниця полягає в тому, що якщо перший пункт (той, що передує AndAlso) істинний, другий пункт ніколи не оцінюється - складне логічне вираження "коротке замикання".

Іноді це дуже корисно, наприклад у такому виразі, як:

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

Використання старого І у вищенаведеному виразі кине NullReferenceException, якби myObj був нульовим.


5

Також див. Запитання про переповнення стека: Чи слід завжди використовувати оператори AndAlso та OrElse? .

Також: коментар для тих, хто згадав про використання, Andякщо права частина виразу має побічну дію:

Якщо правий бік має потрібний вам побічний ефект, просто перемістіть його в ліву частину, а не використовуючи "І". Вам потрібне дійсно лише "І", якщо обидві сторони мають побічні ефекти. І якщо у вас так багато побічних ефектів, ви, ймовірно, робите щось інше не так. Загалом, вам справді слід віддати перевагу AndAlso.


3

На додаток до вищезазначених відповідей, AndAlso забезпечує процес кондиціонування, відомий як коротке замикання. У багатьох мовах програмування вбудована така функціональність, як і vb.net, і вони можуть забезпечити значне підвищення продуктивності у твердженнях про тривалий стан, вирізавши непотрібні оцінки.

Іншою подібною умовою є умова OrElse, яка перевірятиме правильну умову лише у тому випадку, коли ліва умова є помилковою, таким чином вирізаючи непотрібні перевірки стану після виявлення справжньої умови.

Я б радив вам завжди використовувати процеси короткого замикання та структурувати свої умовні висловлювання таким чином, щоб цим виграли найбільше користі. Наприклад, спершу випробуйте свої найефективніші та найшвидші умови, щоб ви запускали свої довгі умови лише тоді, коли вам зовсім доведеться та коротко замикаєтесь в інші рази.


Також варто згадати IIF (негайне значення If), оскільки він не має короткого замикання і може створити умови, зовсім не схожі на наміри програміста, оскільки оцінюються і справжній, і хибний компоненти. Раніше хтось заявляв, що вони використовують цю побічну поведінку навмисно, але - я не вважаю це ефективним методом, оскільки Негайний Якщо не має цілеспрямованого наміру виконувати оцінку таким чином, який я можу виявити.
jinzai

"Крім відповідей вище, AndAlso забезпечує процес кондиціонування, відомий як коротке замикання." Кожна відповідь вище цієї фокусується на короткому замиканні. : P Але гарний опис та рекомендації.
підкреслюй_

1

Для більшості з нас OrElse та AndAlso виконають трюк, за винятком кількох заплутаних винятків (менше 1%, коли нам, можливо, доведеться використовувати Or і And).

Постарайтеся не захоплюватися людьми, демонструючи свою булеву логіку і роблячи це схожим на ракетну науку.

Це досить просто і прямо вперед, і час від часу ваша система може працювати не так, як очікувалося, оскільки вона в першу чергу не подобається вашій логіці. І все-таки ваш мозок постійно говорить вам, що його логіка перевірена і перевірена на 100%, і вона повинна працювати. У той самий момент перестаньте довіряти своєму мозку і попросіть його подумати ще раз (чи не OrElse чи, можливо, OrElse), ви змусите себе шукати іншу роботу, яка не потребує особливої ​​логіки.


0

Щоб зрозуміти зі словами, не кодами:

Використовуйте випадок: за
допомогою "І" компілятор перевірить усі умови, тому якщо ви перевіряєте, чи може об'єкт бути "Нічого", а потім ви перевіряєте одну з його властивостей, ви будете мати помилку часу запуску.
Але з AndAlso з першим "помилковим" в умовах він перевірить наступний, щоб у вас не виникло помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.