Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект? / 25 сообщений из 42, страница 1 из 2
17.06.2020, 17:22
    #39970303
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Всем привет.
Некоторое время пользуюсь вот такой конструкцией без явного создания объекта через оператор with
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
dim n1 as Long
dim n2 as Long

  With DBEngine(0)(0).OpenRecordset("select * from table1)
    n1 = .Fields!l1
    n2 = .Fields!l2
  End With


По идее, с оператором With объект создаётся, а уничтожается должен в конце блока оператором End With....
Вопрос, а нужно ли его ещё закрывать перед этим командой
Код: vbnet
1.
.Close

кто знает ?
...
Рейтинг: 0 / 0
17.06.2020, 17:49
    #39970315
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
Некоторое время пользуюсь вот такой конструкцией без явного создания объекта через оператор with
с чего бы?

melihron
а нужно ли его ещё закрывать перед этим командой
По-хорошему да.
...
Рейтинг: 0 / 0
17.06.2020, 17:59
    #39970324
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Панург
melihron
Некоторое время пользуюсь вот такой конструкцией без явного создания объекта через оператор with
с чего бы?

а где здесь явное создание объекта типа
Код: vbnet
1.
2.
dim rs as Recordset
set rs = DBEngine(0)(0).OpenRecordset("select * from table1)

?
В Си Шарпе по крайней мере так - неявное создание - закрытие и освобождение памяти автоматом в конце блока
Панург
melihron
а нужно ли его ещё закрывать перед этим командой
По-хорошему да.
но память же всё-равно освобождается, типа присваивается ему Nothing наверно... а на выходе из процедуры, в которой этот блок и вообще всё созданное в этой процедуре должно уничтожаться...... по идее.....
...
Рейтинг: 0 / 0
17.06.2020, 19:32
    #39970372
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
...
ИМХО, не стоит тащить идеологию одного ЯП в монастырь другого...
...
Рейтинг: 0 / 0
17.06.2020, 20:46
    #39970382
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
По идее, с оператором With объект создаётся, а уничтожается должен в конце блока оператором End With....
Создаётся - да. Уничтожается - с какого бы это перепугу? То есть для некоторых типов объектов это верно, но далеко не для всех.

melihron
нужно ли его ещё закрывать перед этим командой
Да.
...
Рейтинг: 0 / 0
17.06.2020, 20:50
    #39970383
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
В Си Шарпе по крайней мере так - неявное создание - закрытие и освобождение памяти автоматом в конце блока
Даже если это какой-то ActiveX, COM или DDE-сервер? Вот прям представляю, как шарпейная программа работает с файлом экселя, и у меня закрывается документ экселя, открытый, пока программа пыхтела, свёрнутая в трей... да за такие приколы и лицо пощупать могут.
...
Рейтинг: 0 / 0
18.06.2020, 00:01
    #39970415
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Akina,
м? о чём вы ?
в шарпе я имею ввиду конструкцию using... например:
Код: c#
1.
2.
3.
4.
using (SqlCommand cmd = new SqlCommand(query, buh.sqlConn))
{
    cmd.ExecuteNonQuery();
}

неявно создаётся переменная cmd класса SqlCommand, выполняется инструкция в фигурных скобках и .... и собственно всё... переменная уничтожается.... очень удобно...
сорри за офтоп на другом языке
...
Рейтинг: 0 / 0
18.06.2020, 04:43
    #39970435
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
неявно создаётся переменная cmd класса SqlCommand
Почему неявно? Вполне явно и конструктор используется. Так обычно работают с объектами реализующими интерфейс IDisposable. И область видимости переменной ограничена блоком using.
В VBA у переменных тоже есть области видимости.
...
Рейтинг: 0 / 0
18.06.2020, 07:20
    #39970440
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
неявно создаётся переменная cmd класса SqlCommand, выполняется инструкция в фигурных скобках и .... и собственно всё... переменная уничтожается.... очень удобно...

Во-первых, явно - у неё даже имя есть (в отличие от VB-кода - вот там как раз неявно, и имени нет).
Во-вторых, уничтожение переменной не означает разрушения объекта. Я не зря упомянул именно эксель - его хост-процесс выгружается? точно? проверьте... особенно случай, когда две копии программы параллельно и одновременно формируют себе хост-процесс показанным методом - их загружается один или два? и потом правильно ли выполняется, если вообще выполняется, выгрузка?
...
Рейтинг: 0 / 0
18.06.2020, 18:20
    #39970613
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
А вот в такой конструкции Close нужен ?
Код: vbnet
1.
n = DBEngine(0)(0).OpenRecordset("select field1 from tablya").Fields(0).Value
...
Рейтинг: 0 / 0
19.06.2020, 02:01
    #39970697
ЦЦа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron,

опасения, что надо пользоваЦЦа явным Close, проистекают из (старых) грехов (старого) DAO. Вот тема для курения, всё, что нужно, там, ИМХО, сказали. Читать до конца. Совсем до конца (он может показаЦЦа несколько неожиданным). Если есть желание разобраЦЦа, конечно.
...
Рейтинг: 0 / 0
19.06.2020, 13:43
    #39970880
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron
Всем привет.
Некоторое время пользуюсь вот такой конструкцией без явного создания объекта через оператор with
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
dim n1 as Long
dim n2 as Long

  With DBEngine(0)(0).OpenRecordset("select * from table1)
    n1 = .Fields!l1
    n2 = .Fields!l2
  End With


По идее, с оператором With объект создаётся, а уничтожается должен в конце блока оператором End With....
Вопрос, а нужно ли его ещё закрывать перед этим командой
Код: vbnet
1.
.Close

кто знает ?


Проверь адрес ячейки памяти, зарезервированный под обьектную переменную твою внутри блока with и вне блока with и получишь ответ, что гадать то)
...
Рейтинг: 0 / 0
19.06.2020, 15:33
    #39970957
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов
Проверь адрес ячейки памяти, зарезервированный под обьектную переменную твою внутри блока with и вне блока with и получишь ответ, что гадать то)

Покажите пожалуйста как?
...
Рейтинг: 0 / 0
19.06.2020, 19:46
    #39971071
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
ROI,

В VBA есть несколько функций, которые очень редко используют при работе в VBA. На наших русскоязычных форумах имею в виду .
Вот они:
VarPtr - возвращает адрес переменной
VarPtrArray - возвращает адрес массива
VarPtrStringArray - возвращает адрес строки массива
StrPtr - возвращает адрес строкового буфера UNICODE
ObjPtr - возвращает указатель на интерфейс, на который ссылается переменная объекта

Давайте на примере рекордсета сразу и покажу:
Код: vbnet
1.
2.
3.
4.
5.
6.
Set rs = CurrentDb.OpenRecordset("т_продажи")
MsgBox ObjPtr(rs)
rs.Close
MsgBox ObjPtr(rs)
Set rs = Nothing
MsgBox ObjPtr(rs)



Если по примеру выше:
-когда рекордсет открыт - выводится адрес (число)
-когда рекордсет закрыт (rs.close)- выводится этот же адрес (число) - рекордсет закрыт, но еще занимает память
-И только когда мы уничтожаем его
Код: vbnet
1.
Set rs = Nothing


MsgBox выводит 0

Функции достаточно интересные, недокументированные, на нашем форуме их не видал. Берите на здоровье)
...
Рейтинг: 0 / 0
19.06.2020, 22:44
    #39971116
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов,

Ишь тыыыы... спасибо, добрый человек... будем посмотреть... я думал на VBA подобных инструкций нету...
...
Рейтинг: 0 / 0
20.06.2020, 05:53
    #39971155
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов,

Спасибо но довольно всё не однозначно!
https://www.sql.ru/forum/799937-2/obyasnite-raznicu-mezhdu-me-form-recordsource-i-me-recordsource
...
Рейтинг: 0 / 0
20.06.2020, 06:31
    #39971157
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов
VarPtrStringArray - возвращает адрес строки массива
это в какой-такой версии?
...
Рейтинг: 0 / 0
20.06.2020, 06:32
    #39971158
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов
VarPtrStringArray - возвращает адрес строки массива
и это тоже...
...
Рейтинг: 0 / 0
20.06.2020, 06:35
    #39971159
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов
Давайте на примере рекордсета сразу и покажу:
на примере With покажи? Чего туда пихать?
...
Рейтинг: 0 / 0
20.06.2020, 09:56
    #39971170
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Панург,
Что хочешь, то и пихай)
...
Рейтинг: 0 / 0
20.06.2020, 10:37
    #39971175
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов,

ээмм... а чё-то я не пойму, с какого боку прикрутить
ObjPtr - возвращает указатель на интерфейс, на который ссылается переменная объекта
если переменной то нету... Если объектная переменная есть, то Есть, чего проверять.... а когда её нету ?
Код: vbnet
1.
2.
3.
4.
  With DBEngine(0)(0).OpenRecordset("select * from table1)
    n1 = .Fields!l1
    n2 = .Fields!l2
  End With

Допустим мы получили адрес возвращаемых полей внутри блока With.... а чего потом с ними делать вне блока With ? ..... переменных то нету.... : )
...
Рейтинг: 0 / 0
20.06.2020, 10:40
    #39971176
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Сергей Лалов
Что хочешь, то и пихай)
нет уж, в контексте вопроса. Как поможет ObjPtr в случае кэширование объекта, без применения переменных?
...
Рейтинг: 0 / 0
20.06.2020, 11:00
    #39971181
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
melihron,
Ты не можешь в блоке with в таком контексте обратиться к самому объекту. Только к его свойствам к сожалению. Я не смог, именно с этим экземпляром не прокатывает.
Панург,
Остаётся поверить майкрософту на слово, что внутри блока with происходит уничтожение
...
Рейтинг: 0 / 0
20.06.2020, 11:09
    #39971182
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
хотя..
...
Рейтинг: 0 / 0
20.06.2020, 11:15
    #39971184
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Код: vbnet
1.
2.
3.
4.
5.
6.
With DBEngine(0)(0)
   Set rs = .OpenRecordset("таблица")
   MsgBox ObjPtr(rs)
  End With
  MsgBox ObjPtr(rs)
End Sub



Вот здесь после присвоения, область видимости рекордсета простирается и за пределы блока With. И он жив. Но это потому что я объявил его в самом теле With. Хитрый вопрос.

Если убрать Set , то тоже жив.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект? / 25 сообщений из 42, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]