It might be true in the ARX/C++ world, but not for .NET. In fact, wrapping the RegAppTableRecord creation in a using block prevents AutoCAD from crashing if the object is not able to be successfully added to the database due to some reason. If successful, it won't hurt to dispose of the newly created RegAppTableRecord instance even if not quite necessary in this case.Я не понял, каким образом в указанном случае блок using может предотвратить падение AutoCAD? Данный блок лишь гарантирует вызов RegAppTableRecord.Dispose, но не занимается обработкой исключений, как это делает try\catc. Если бы речь шла о try\catch, то это бы больше походило на правду, но using...
Далее делаем выводы что в коде автора в случае нормального выполнения Close будет вызван дважды, что ка раз и может приводить к краху AutoCAD.Автор в своём коде не вызывает Close, поэтому дважды он, наверное, не будет выполнен, хотя... Когда транзакция закрывается, она вызывает Dispose или Close для объектов, добавленных ею в базу данных, или нет? Насколько я помню - вызывает Dispose...
Насколько я помню - вызывает Dispose...Я же выше показал, что Dispose в свою очередь для наследников DBObject вызывает Close, если у них ObjectId != null.
Например, насколько я вижу - без этого можно было спокойно обойтись (похоже, что ILSpy "нагенерировал" от души)...Главное суть. Понятно, что оптимизацией кода он не занимается, а только выполняет дизассемблирование.
Когда транзакция закрывается, она вызывает Dispose или Close для объектов, добавленных ею в базу данных, или нет? Насколько я помню - вызывает Dispose...Ответ простой: либо да, либо нет. Предполагаю, что да (т.е. выполняется уничтожение объекта).
Ответ простой: либо да, либо нет. Предполагаю, что да (т.е. выполняется уничтожение объекта).Ох! Ничего он не уничтожает. Запомни, что метод Dispose не всегда уничтожает объект. Перечитай (внимательно) что я написал выше.
Ответ простой: либо да, либо нет. Предполагаю, что да (т.е. выполняется уничтожение объекта).Оп оп - вызов Dispose() и уничтожение объекта- "это 4 разных человека" - любой объект и так уничтожит GC когда он будет "никому не нужен" - .Dispose() - это как-бы сообщения системе - "я освободил".
Я немного подправил текст первого ответа.
Первый Close будет вызван при выходе из блока using (RegAppTableRecord regAppRecord = new RegAppTableRecord()) {}Вот об этом я и писал здесь (http://adn-cis.org/forum/index.php?topic=737.msg2744#msg2744).
Второй Close будет вызван при вызове tr.Commit();