Простые вопросы и ответы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Простые вопросы и ответы

Сообщение Viper » 28.08.2008 (Чт) 12:52

Буду помещать сюда всяческие полезные советы, позволяющие улучшить код ваших программ.
Итак.
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Простые вопросы и ответы

Сообщение Viper » 28.10.2008 (Вт) 13:26

1. Как проверить, является ли строка пустой.

Часто встречается прямолинейное решение - сравнение строки с пустой строкой:
Код: Выделить всё
If sMyString <> "" Then
Это некорректный и медленный способ. Во-первых, при этом будет создаваться временная пустая строка, во-вторых, сравнение двух строк само по себе является достаточно медленной операцией. Не лучше выглядит вариант сравнения с vbNullString:
Код: Выделить всё
If sMyString <> vbNullString Then
Данная константа, предназначена в первую очередь для передачи в API-функции нулевой строки. А для решения нашего вопроса данный способ практически не имеет преимуществ перед первым вариантом.
Правильный вариант. Это проверка длины строки:
Код: Выделить всё
If Len(sMyString) Then
Этот вариант гораздо быстрее, по причине того, что длина строки хранится в четырех байтах перед самой строкой, и функция Len просто возвращает это число.
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Простые вопросы и ответы

Сообщение Viper » 28.10.2008 (Вт) 13:28

2. О правильном сравнении.

Иной раз попадается такой код:
Код: Выделить всё
If A = True Then
или
Код: Выделить всё
If A = False Then
Предполагается, что A либо булева переменная, либо булево выражение. На первый взгляд вроде бы все нормально. А на второй получаем полную чушь. Если A есть True, то мы сравниваем True с True, что бессмысленно. Если A - False, то смысла тоже не прибавляется. Для корректной работы вполне хватает такого кода:
Код: Выделить всё
If A Then
или
Код: Выделить всё
If Not A Then
и незачем производить дополнительное сравнение.
Еще один пример неудачного кода:
Код: Выделить всё
If A = 0 Then
Здесь A является целым числом. Если A равно нулю, то при преобразовании в Boolean получим False, если A нулю не равно, то получим True. Спрашивается, зачем же делать дополнительное сравнение? Вполне достаточно кода
Код: Выделить всё
If AThen
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Простые вопросы и ответы

Сообщение Viper » 28.10.2008 (Вт) 13:32

3. О сравнении действительных чисел.

В силу специфики формата хранения чисел с плавающей запятой непосредственное сравнение действительных чисел може привести к ошибкам при выполнении кода. Допустим, имеется числа 1.29999999 и 1.30000001. Практически ода эти числа равны 1.3. Но если их сравнить при помощи оператора равенства, то, естественно результат будет отрицательным. Поэтому действительные числа необхоимо сравнивать с учетом заданной точности. Делается это следующим образом. Объявляется константа задающая необходимую точность вычислений. После чего все сравнения производятся при помощи этой константы. При этом считаем, что все числа равные или меньшие заданной константы равны нулю.
Код: Выделить всё
Const Epsilon As Double = 0.000001
' ...
' Равенство двух чисел
If Abs(nDouble1 - nDouble2) <= Epsilon Then
' ...
' Равенство числа нулю
If Abs(nDouble) <= Epsilon Then
' ...
' Сравнение двух чисел
' При выполнении условия, первое число больше второго
If nDouble1 - nDouble2 > Epsilon Then
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Простые вопросы и ответы

Сообщение alibek » 31.05.2017 (Ср) 9:47

Надо же, не знал.
Код: Выделить всё
Dim FName, LName

FName = "Имя": LName = "Фамилия"
? "<" & LName & ", " & FName & ">"  ' <Фамилия, Имя>
? "<" & LName & (", " + FName) & ">"  ' <Фамилия, Имя>

FName = Null: LName = "Фамилия"
? "<" & LName & ", " & FName & ">"  ' <Фамилия, >
? "<" & LName & (", " + FName) & ">"  ' <Фамилия>

В случае & значение null интерпретируется как пустая строка.
В случае + значение null интерпретируется как null и результат получается null.
Я раньше использовал IIf, но так гораздо лучше.
Жаль что во многих других языках такой особенности нет.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 13

    TopList