#excel #vba #vb.net
#excel #vba #vb.net
Вопрос:
На C или других языках if
вычисляется с использованием вычисления короткого замыкания. Но в VB, VB.Net Я вижу, что if
это не останавливает оценку после получения 100% результата. Этот код в порядке
dim str as string
str=""
If Len(str) = 0 Then
Console.WriteLine("yes")
end if
Но это выдает ошибку,
dim str as string
str=""
If Len(str) = 0 Or CInt(str) > 0 Then 'Error System.InvalidCastException:
Console.WriteLine("yes")
end if
Очевидно, что нулевая строка не преобразуется в целое число. if
проверка Len(str) = 0
get true
и должна прекратиться, но она снова вычисляется следующей.
Почему это так???
Но в коротком замыкании перечислены vb, vba, vb.net как поддерживается.
Другой пример,
dim str as integer
str=10
If str=10 and str="" Then 'Error
Console.WriteLine("yes")
end if
Комментарии:
1. Именно так работает VBA. Он был создан до возникновения короткого замыкания. Если вы используете VB.NET вы можете использовать
AndAlso
orOrElse
, но не в VBA.2. @braX я совершенно уверен, что короткое замыкание существовало в течение многих лет в семействе языков C на момент создания VBA. Я бы скорее подумал, что в то время это было дизайнерское решение, чтобы избежать нескольких операторов «и» и «или», и в этом случае наиболее общей формой является та, которая принята там, где они являются побитовыми операторами.
3. Вы на самом деле работаете в VB.Net ? Если это так, не используйте
CInt()
, или любой из методов, которые вы перечисляете выше. Используйте целое число. Вместо этого попробуйте выполнить синтаксический анализ() .4. @Idle_Mind Согласен, если вы проверяете пользовательский ввод или неизвестный источник, но на меня повлиял docs.microsoft.com/en-us/dotnet/visual-basic/language-reference /… относительно CInt() и т.д.
Ответ №1:
Но в коротком замыкании перечислены vb, vba, vb.net как поддерживается.
Я думаю, вы неправильно поняли источник. В нем перечислены .NET и VBA, но для
- Visual Basic .NET
- Нетерпеливые операторы:
And
,Or
- Операторы короткого замыкания:
AndAlso
,OrElse
- Нетерпеливые операторы:
- Visual Basic, Visual Basic для приложений (VBA)
- Нетерпеливые операторы:
And
,Or
- Операторы короткого замыкания:
Select Case
- Нетерпеливые операторы:
Таким образом, на самом деле говорится, что .NET поддерживает короткие замыкания только для операторов AndAlso
, OrElse
а VBA поддерживает короткие замыкания только для оператора Select Case
.
Но в вашем примере используется using And
, Or
которые перечислены как нетерпеливые операторы.
Итак, этот код в VB.NET
Dim str As String
str = ""
If Len(str) = 0 Or CInt(str) > 0 Then 'Error System.InvalidCastException:
Console.WriteLine("yes")
End If
Может быть переписан как
Dim str As String
str = ""
If Len(str) = 0 OrElse CInt(str) > 0 Then
Console.WriteLine("yes")
End If
или как вложенный statment
Dim str As String
str = ""
If Not Len(str) = 0 Then
If CInt(str) > 0 Then
Console.WriteLine("yes")
End If
Else
Console.WriteLine("yes")
End If
или
Dim str As String
str = ""
If Len(str) = 0 Then
Console.WriteLine("yes")
ElseIf CInt(str) > 0 Then
Console.WriteLine("yes")
End If
Комментарии:
1. НЕТ … тот же вложенный оператор Dim str, что и String str = «» Если не Len(str) = 0, то если CInt(str)> 0, то консоль. Строка записи («да») Завершите, если еще консоль. Строка записи («да») завершается, если
2. @AyanBhunia вы правы, исправили это. Это отвечает на ваш вопрос?