powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект?
25 сообщений из 42, страница 1 из 2
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39970303
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

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

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

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

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

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

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

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

опасения, что надо пользоваЦЦа явным Close, проистекают из (старых) грехов (старого) DAO. Вот тема для курения, всё, что нужно, там, ИМХО, сказали. Читать до конца. Совсем до конца (он может показаЦЦа несколько неожиданным). Если есть желание разобраЦЦа, конечно.
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39970880
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39970957
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Проверь адрес ячейки памяти, зарезервированный под обьектную переменную твою внутри блока with и вне блока with и получишь ответ, что гадать то)

Покажите пожалуйста как?
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971071
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971116
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов,

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

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

ээмм... а чё-то я не пойму, с какого боку прикрутить
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
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971176
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Что хочешь, то и пихай)
нет уж, в контексте вопроса. Как поможет ObjPtr в случае кэширование объекта, без применения переменных?
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971181
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihron,
Ты не можешь в блоке with в таком контексте обратиться к самому объекту. Только к его свойствам к сожалению. Я не смог, именно с этим экземпляром не прокатывает.
Панург,
Остаётся поверить майкрософту на слово, что внутри блока with происходит уничтожение
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971182
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя..
...
Рейтинг: 0 / 0
Оператор with. Нужно ли в нём закрывать созданный в нём объект?
    #39971184
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
25 сообщений из 42, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оператор with. Нужно ли в нём закрывать созданный в нём объект?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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