|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Собсно сабж... Давно хотел спросить, но щаз только руки дошли. А ноги выросли осюда: 19929570 Продублирую для порядку: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
sb_Close - внутри попытка закрыть объект через .Close, а если не поддерживается - то пропустить. На выходе - Set Nothing. rst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2. Чем это грозит? Коллизий пока не было... или я прозевал их, или еще как.... но все работает. Однако мало-мало мохаю... переживаю... . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 13:37 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant PigeonСобсно сабж... Давно хотел спросить, но щаз только руки дошли. А ноги выросли осюда: 19929570 Продублирую для порядку: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
sb_Close - внутри попытка закрыть объект через .Close, а если не поддерживается - то пропустить. На выходе - Set Nothing. rst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2. Чем это грозит? Коллизий пока не было... или я прозевал их, или еще как.... но все работает. Однако мало-мало мохаю... переживаю... . В теле инструкции With может всегда неожиданно возникнуть исключение. И до закрытия дело не дойдет. уничтожать и закрывать объекты желательно в при выходе из процедуры или обработчика ошибок. Так надежнее. С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 13:50 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
При создании дочернего рекордсета создается полностью новый рекордсет, он уже не связан родительским, так что можно его закрывать без проблем. Где это происходит - внутри With или просто с использованием переменной особой разницы нет, вложенные With также обрабатываются корректно. Я, кстати, всегда закрываю и обнуляю рекодсеты на выходе из процедуры, после On Error Resume Next, этот кусок кода выполняется всегда, в том числе и при ошибках. Если у вас нет еще одного вызова sb_Close на выходе, то в некоторых случаях память будет утекать, не вижу особого смысла в досрочном закрытии рекордсета, если только он заново не открывается после закрытия. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 13:55 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
ROIВ теле инструкции With может всегда неожиданно возникнуть исключение. И до закрытия дело не дойдет. уничтожать и закрывать объекты желательно в при выходе из процедуры или обработчика ошибок. Так надежнее. С уважением. ROI, ты меня только не пугай - пуганые ужЕ :) Отвечаешь, как мальчику... обидно даже... Какие иксепшены?! Это ж последняя строка внутри With, если уж до нее дело дошло! После нее - только End With. Внутри процедуры закрытия единственный лишь зик-хайльеррорхэндлер - на наличие у объекта метода .Close Все. Я вижу проблему в том, что, обращаясь к объекту через With, мы его самогО внутри этого обращения трансклюкируем. И я не уверен в том, что With это чисто компиляторская приблуда, а не исполняемого кода. К чему будет относиться End With ? !!!!!!!! когда объект ужЕ трасклюкирован?.. . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:07 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant Pigeon, Если With используется с объявленной переменной, то с переменной ничего не происходит после End With, а если используется не объявленная переменная, а выражение типа Код: vbnet 1.
То соответственно эта "переменная" трансклюкируется после end with. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:11 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
MrShinПри создании дочернего рекордсета создается полностью новый рекордсет, он уже не связан родительским, так что можно его закрывать без проблем. Где это происходит - внутри With или просто с использованием переменной особой разницы нет, вложенные With также обрабатываются корректно. Я, кстати, всегда закрываю и обнуляю рекодсеты на выходе из процедуры, после On Error Resume Next, этот кусок кода выполняется всегда, в том числе и при ошибках. Если у вас нет еще одного вызова sb_Close на выходе, то в некоторых случаях память будет утекать, не вижу особого смысла в досрочном закрытии рекордсета, если только он заново не открывается после закрытия. Спасибо. Ну, я примерно понял твое вью про рекордсет. А как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом? Без дочек-мам. Эзитселф? . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:11 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant PigeonROI, ты меня только не пугай - пуганые ужЕ :) Отвечаешь, как мальчику... обидно даже... Какие иксепшены?! Это ж последняя строка внутри With, если уж до нее дело дошло! После нее - только End With. Это вы меня пугаете Код: vbnet 1. 2. 3. 4.
В любой строке может возникнуть исключение и до вашего (Call sb_Close(rst2)) дело не дойдет. Будьте не так категоричны. С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:13 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом? Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing. Если же объект был создан неявно при вызове With, то если перед выходом мы его насильно обнулим, End With просто еще раз попытается его обнулить, не произойдет ничего. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:35 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
ROILieutenant PigeonROI, ты меня только не пугай - пуганые ужЕ :) Отвечаешь, как мальчику... обидно даже... Какие иксепшены?! Это ж последняя строка внутри With, если уж до нее дело дошло! После нее - только End With. Это вы меня пугаете Код: vbnet 1. 2.
With rst .Filter = sFlt Set rst2 = .OpenRecordset lRecCnt(2) = fn_RecCntRst(rst2) Код: vbnet 1. 2.
В любой строке может возникнуть исключение и до вашего (Call sb_Close(rst2)) дело не дойдет. Будьте не так категоричны. С уважением. Lieutenant Pigeonrst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2 . . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:43 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
MrShinLieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом? Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing. Если же объект был создан неявно при вызове With, то если перед выходом мы его насильно обнулим, End With просто еще раз попытается его обнулить, не произойдет ничего. * объект был создан неявно при вызове With Явно и задолго до With * после End With он так и останется со значением Nothing Меня очень интересут не судьба объектной переменной и не значение ее после... А - что произойдет М Е Ж Д У присвоением ей Nothing после Close (если таковое возможно) и End With * End With просто еще раз попытается его обнулить Пруфы в студию Не! Спасибо! Но, думаю, это вы погорячились :) . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 14:51 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant PigeonLieutenant Pigeonrst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2 . Что такое дочерний к RST? Я не знаю такого понятия. Из вашего кода вообще не следует что rst2 как то относится к rst. по этому я может и не пойму вашего вопроса. С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 15:19 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant Pigeonчто произойдет М Е Ж Д У присвоением ей Nothing после Close (если таковое возможно) и End With Ровным счетом ничего. После присвоения переменной Nothing, она так и остается Nothing и до End With и после, можете проэкспериментировать. Физически при вызове With происходит следующее: ссылка на существующий объект помещается в СТЕК, а не в общую память. Соответственно при End With эта ссылка просто выталкивается из стека и исчезает из области видимости. Именно поэтому нельзя в принципе обнулить неявно созданную переменную внутри With, я действительно погорячился с завлением о том, With попытается еще раз обнулить - до этого не дойдет, ибо доступа к стеку на запись нет, только чтение. В языке даже нет конструкции, позволяющей получить неявную переменную - просто точку не воспринимает еще компилятор. Вот здесь есть некоторые подробности: https://msdn.microsoft.com/en-us/library/wc500chb.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 15:34 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
MrShin, спасибо за наводку. Прочел как мог. Оказывается читал уже. Немного мимо интересующей меня механики - но полезно освежиться. На данном этапе обсуждения меня ужЕ скилл подводит :( Давай упростимся. Скажи, какое из утверждений ты, лично, приемлешь для себя: 1. Не допускать закрытия объекта внутри обращения к нему через With 2. Наплявать... -вать... -вать... Вот, как писали бы мы с тобой Устав караульной службы, скажем... что бы написали? . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:44 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Lieutenant Pigeon2. Наплявать... -вать... -вать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:30 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
MrShinLieutenant Pigeon2. Наплявать... -вать... -вать.. С твоего позволения, могу ли я это проинтерпретировать, как: MrShin(?)За нас с тобой уже подумали старшие товарищи. Не доверять им оснований нет. . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:38 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
Видимо, да :) Я, во всяком случае, никогда не нарывался на проблемы с With, на всякий случай еще и проверил перед тем, как написать. МС подтверждает это описанием механизма работы With - объект живет своей жизнью, With держит в стеке только ссылку на этот объект ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 19:07 |
|
Чем чревато закрытие объекта внутри его With?
|
|||
---|---|---|---|
#18+
На мой взгляд, ничОго особлЫвого не произойдёт, если закрыть объект внутри его же With. :-) Я обычно так и открываю/закрываю аналогичные рекорсеты, файлсистемобжекты и прочую объектную мелочёвку. То есть, примерно так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Ну и в обработчике ошибок (если оно вдруг так получилось) трансклюкирую объект ещё раз на всякий случай, предварительно указав On Error Resume Next. Тоже того... переживаю, когда такое случается, но всё мало-мало работает, однако. )) Работаю сейчас в Access10 (32 разряда). У пользователей - рантайм разных версий, от 2003 до 2013. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2016, 12:56 |
|
|
start [/forum/topic.php?fid=45&msg=39354019&tid=1612943]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 260ms |
total: | 395ms |
0 / 0 |