Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Разница в производительности между IIf() и If
В Visual Basic существует ли разница в производительности при использовании функции IIf вместо оператора If ?
У VB есть следующее утверждение If , к которому относится вопрос, я думаю:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Первый-это в основном тернарный условный оператор C#'s, а второй-его коалесцирующий оператор (return result , если это не Nothing, в этом случае return "Alternative"). Таким образом, If заменило IIf , а последнее устарело.
Как и в условном операторе C#, VB If коротких замыканий, так что теперь вы можете спокойно написать следующее, что невозможно с помощью функции IIf :
Dim len = If(text Is Nothing, 0, text.Length)
IIf() запускает как истинный, так и ложный код. Для таких простых вещей, как числовое присвоение, это не имеет большого значения. Но для кода, который требует какой-либо обработки, вы тратите впустую циклы, выполняющие условие, которое не соответствует, и, возможно, вызывающие побочные эффекты.
Иллюстрация кода:
Module Module1
Sub Main()
Dim test As Boolean = False
Dim result As String = IIf(test, Foo(), Bar())
End Sub
Public Function Foo() As String
Console.WriteLine("Foo!")
Return "Foo"
End Function
Public Function Bar() As String
Console.WriteLine("Bar!")
Return "Bar"
End Function
End Module
Выходы:
Foo!
Bar!
Кроме того, еще одна большая проблема с IIf заключается в том, что он будет фактически вызывать любые функции, которые находятся в аргументах [1], так что если у вас есть ситуация, подобная следующей:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Это действительно вызовет исключение, которое не так, как большинство людей думают, что функция работает в первый раз, когда они ее видят. Это также может привести к некоторым очень трудно исправить ошибки в приложении, а также.
[1] функция IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Лучше использовать If вместо IIf, чтобы правильно использовать механизм вывода типа (опция Infer On)
В этом примере ключевые слова распознаются как строка, когда я использую If :
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
В противном случае он распознается как объект :
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Я считаю, что главное различие между If и IIf-это:
If (test [boolean], statement1, statement2) это означает, что в соответствии с тестовым значением будет выполняться либо satement1, либо statement2 (только один оператор будет выполняться)
Dim obj = IIF(test [boolean], statement1, statement2) это означает, что оба оператора будут выполняться, но в соответствии с тестовым значением один из них вернет значение в (obj).
так что если один из операторов выдаст исключение, то он все равно выдаст его в (IIf), но в (If) он выдаст его только в том случае, если условие вернет свое значение.
Кроме того, в этом случае читабельность, вероятно, должна быть более предпочтительной, чем производительность. Даже если IIF был более эффективным, он просто менее читаем для целевой аудитории (я предполагаю, что если вы работаете в Visual Basic, вы хотите, чтобы другие программисты могли легко читать ваш код, что является самым большим преимуществом VB... и который теряется с такими понятиями, как IIF на мой взгляд).
Кроме того, " IIF-это функция, а IF-часть синтаксиса языков"... что подразумевает для меня, что, действительно, если бы было быстрее... если только для этого оператор If может быть сведен непосредственно к небольшому набору опкодов вместо того, чтобы идти в другое пространство в памяти для выполнения логики, найденной в указанной функции. Это банальная разница, возможно, но стоит отметить.
... о том, почему это может занять столько времени, сколько 6x, quoth wiki:
Поскольку IIf - это библиотечная функция, она всегда будет требовать накладных расходов на а вызов функции, тогда как условный оператор, скорее всего, будет производить встроенный код.
По сути, IIf является эквивалентом тернарного оператора в C++/C#,, поэтому он дает вам несколько хороших операторов типа 1 строка if/else, если вы этого хотите. Вы также можете дать ему функцию оценки, если хотите.
Эти функции отличаются друг от друга! Возможно, вам нужно только использовать оператор IF. IIF всегда будет медленнее, потому что он будет выполнять обе функции плюс он будет выполнять стандартный оператор IF.
Если вам интересно, почему существует функция IIF, возможно, это будет объяснением:
Sub main()
counter = 0
bln = True
s = iif(bln, f1, f2)
End Sub
Function f1 As String
counter = counter + 1
Return "YES"
End Function
Function f2 As String
counter = counter + 1
Return "NO"
End Function
Так что счетчик будет 2 после этого, но s будет только "YES". Я знаю, что этот счетчик бесполезен, но иногда есть функции, которые вам понадобятся для запуска, независимо от того, является ли IF истинным или ложным, и просто назначьте значение одной из них Вашей переменной.