если вычисление в vba, vb.net

#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 or OrElse , но не в 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 вы правы, исправили это. Это отвечает на ваш вопрос?