he.IsNull vs. he.IsVoid - какая разница и что лучше?

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Уже давно использую у себя в проектах свойство he.IsNull для проверки, что поиск по xPath прошел успешно и мы в итоге получили HtmlElement.
Но сейчас сконвертировал кубик "Событие click" и увидел, что там используется he.IsVoid - поэтому возник вопрос(ы):
  1. Что всё таки лучше использовать?
  2. Есть ли принципиальная разница?
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
271
Баллы
63
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Я пользуюсь IsVoid в своих проектах, осечек не наблюдал.
Любопытно то, что я наоборот везде использую IsNull, даже там где не предполагается наличие атрибута "value" - и как раз тоже проблем не наблюдал никогда)

Отчего и возник этот вопрос: такое чувство, что внутри они могут работать абсолютно идентично.
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
271
Баллы
63
Любопытно то, что я наоборот везде использую IsNull, даже там где не предполагается наличие атрибута "value" - и как раз тоже проблем не наблюдал никогда)
Отчего и возник этот вопрос: такое чувство, что внутри они могут работать абсолютно идентично.
Мне кажется, что примерно одинаковый результат из-за того, что "value" на самом деле имеет значение строки "", т.е. не является Null, не совсем пустой.
Может кто более грамотный и опытный чего-нибудь разъяснит, но по логике вроде всё сходится. :-)
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
Может кто более грамотный и опытный чего-нибудь разъяснит, но по логике вроде всё сходится. :-)
Ну почти сходится) Если мне не изменяет память - в c# пустая строка не равна null.

Но вот опытных бы - да, было бы неплохо. Попробуем призвать в тред @darkdiver, @AShaggy, @gigavat и @ibred . Авось проканает, хотя у них и без нас забот до кучи )
 
  • Спасибо
Реакции: orka13 и Metrix

gigavat

Super Moderator
Регистрация
17.11.2011
Сообщения
112
Благодарностей
88
Баллы
28
Ну почти сходится) Если мне не изменяет память - в c# пустая строка не равна null.

Но вот опытных бы - да, было бы неплохо. Попробуем призвать в тред @darkdiver, @AShaggy, @gigavat и @ibred . Авось проканает, хотя у них и без нас забот до кучи )
IsVoid - это когда свойство ZP_ID == -1, т.е. при поиске элемента/документа/таба ничего не нашли и вернули объект с ZP_ID = -1.

IsNull - каждый раз лезет в инстанс и проверяет существует ли этот объект до сих пор. Если был IsVoid, то всегда будет IsNull, потому что к инстансу обращается с помощью ZP_ID.

Если объект не нашли, он IsVoid. Если нашли, но например ушли со страницы, то объект станет IsNull.

Примерно так должно работать)
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
IsNull - каждый раз лезет в инстанс и проверяет существует ли этот объект до сих пор
Правильно ли я понимаю, что если вначале нашли объект (через FindElementByXPath или аналогичные методы), а до того как выполнили проверку IsNull - он исчез из DOM-модели страницы (javascript'ом удалился), то потом при обращении к IsNull будет true?
Если так, то выходит что правильнее как раз использовать IsNull, т.к. объект может удалиться сторонними скриптами (такая ситуация редка, но в теории возможна).
Ну и на сколько я понял, IsVoid будет в разы быстрее за счёт того, что нет обращений к инстансу (вдруг кому-то критично время взаимодействия в миллисекундах со страницей)?

Большое спасибо за разъяснения! :ay::ay::ay:
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Правильно ли я понимаю, что если вначале нашли объект (через FindElementByXPath или аналогичные методы), а до того как выполнили проверку IsNull - он исчез из DOM-модели страницы (javascript'ом удалился), то потом при обращении к IsNull будет true?
Если так, то выходит что правильнее как раз использовать IsNull, т.к. объект может удалиться сторонними скриптами (такая ситуация редка, но в теории возможна).
Ну и на сколько я понял, IsVoid будет в разы быстрее за счёт того, что нет обращений к инстансу (вдруг кому-то критично время взаимодействия в миллисекундах со страницей)?

Большое спасибо за разъяснения! :ay::ay::ay:
я когда-то задавался вроде таким вопросом. Но какие бы тесты не проводил - значения у этих двух свойств всегда одинаковые были, и не было намёков, что там идёт какая-то перепроверка
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 856
Баллы
113
vyt rf;tncz? z rjulf-nj pflfdfkcz gjlj,ysv djghjcjv/ Yj rfr ,s yt ntcnbhjdfk - pyfxtybz gjktq dctulf ,skb jlbyfrjdsvb b ybrfrjuj htxtrf yt ghjbc[jlbkj/ Njkmrj htkjfl xnj-nj vtyzk
Тут скорее всего играло роль то, что скорость работы с инстансом (если говорим о IsNull) - очень высокая, и доступ к нему осуществляется за доли секунды, поэтому если найти объект, а затем сразу сделать проверку IsVoid/IsNull, то результат будет одинаковым за счёт того, что это произойдет моментально.
Ну и да, выходит что по большому счёту разницы то и не будет )
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Тут скорее всего играло роль то, что скорость работы с инстансом (если говорим о IsNull) - очень высокая, и доступ к нему осуществляется за доли секунды, поэтому если найти объект, а затем сразу сделать проверку IsVoid/IsNull, то результат будет одинаковым за счёт того, что это произойдет моментально.
Ну и да, выходит что по большому счёту разницы то и не будет )
хотя, сейчас всё проверил. Вроде работает полноценно. Зря бурчал


Код:
instance.ActiveTab.Navigate("https://ya.ru", "");
instance.WaitFieldEmulationDelay();

HtmlElement he = instance.ActiveTab.FindElementById("text");
project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));


instance.ActiveTab.Navigate("https://google.com", "");
instance.WaitFieldEmulationDelay();

project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));


he = instance.ActiveTab.FindElementById("text");
project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));
 
Последнее редактирование:
  • Спасибо
Реакции: Lord_Alfred

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
хотя, сейчас всё проверил. Вроде работает полноценно. Зря бурчал


Код:
instance.ActiveTab.Navigate("https://ya.ru", "");
instance.WaitFieldEmulationDelay();

HtmlElement he = instance.ActiveTab.FindElementById("text");
project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));


instance.ActiveTab.Navigate("https://google.com", "");
instance.WaitFieldEmulationDelay();

project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));


he = instance.ActiveTab.FindElementById("text");
project.SendInfoToLog(string.Format("{0} - {1}", he.IsVoid, he.IsNull));
Не покажетена примере кода, как возвращать из кубика си шарп выход по красному выходуи по зеленому в заисимсоти от результатов. А токубик на си шарп говорит что все ок, а там нифига не ок
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
Не покажетена примере кода, как возвращать из кубика си шарп выход по красному выходуи по зеленому в заисимсоти от результатов. А токубик на си шарп говорит что все ок, а там нифига не ок
throw new Exception("ошибка");
 
  • Спасибо
Реакции: prodox

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)