Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 13-11-2014, 14:34:36

Название: ObjectIdCollection или List<ObjectId>?
Отправлено: Андрей Бушман от 13-11-2014, 14:34:36
В AutoCAD .NET API имеется класс ObjectIdCollection, реализующий IDisposable. Равнозначны ли оба приведённые ниже варианта работы с коллекцией ObjectId или же вариант с ObjectIdCollection имеет какие-то преимущества?

Код - C# [Выбрать]
  1. using (Db.ObjectIdCollection items = new Db.ObjectIdCollection()) {
  2.         // ...
  3. }

Код - C# [Выбрать]
  1. List<Db.ObjectId> items = new List<Db.ObjectId>();
  2. // ...
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 14:38:40
Равнозначны ли оба приведённые ниже варианта работы с коллекцией ObjectId или же вариант с ObjectIdCollection имеет какие-то преимущества?
Ну как минимум в той форме записи, которую ты указал при выходе из блока using будет вызван items.Dispose(), что явно укажет сборщику мусора, что можно освободить память.
С точки зрения производительности обоих методов - нужно тестировать.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Андрей Бушман от 13-11-2014, 14:43:26
при выходе из блока using будет вызван items.Dispose()
Это я понимаю. Не понимаю, зачем этот класс реализует IDisposable. Я предпочитаю использовать List<Db.ObjectId>. В каких случаях мне всё же лучше использовать ObjectIdCollection?
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Виктор Чекалин от 13-11-2014, 14:53:43
Я подозреваю, что ObjectIdCollection был во времена .NET 2.0 где еще не было Generic List. Для совместимости оставили. В Revit API тоже потихоньку переводят коллекции на типизированные списки.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 14:54:08
Не понимаю, зачем этот класс реализует IDisposable.
Ну это вопрос к инженерной команде AutoCAD.

В каких случаях мне всё же лучше использовать ObjectIdCollection?
Мне известно как минимум два случая:
1) В тех случаях, когда метод явно требует в качестве параметра ObjectIdCollection или возвращает ObjectIdCollection.
2) Когда в силу ограниченности AutoCAD .NET API может понадобится воспользоваться P/Invoke с методом, который получает в качестве параметра AcDbObjectIdArray.
Кстати, AcDbObjectIdArray - это просто динамический массив, элементы которого AcDbObjectId
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 14:55:01
Для совместимости оставили.
Скорее для совместимости с ObjectARX (т.е. с native кодом на C++)
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Андрей Бушман от 13-11-2014, 14:56:05
Мне известно как минимум два случая:
1) В тех случаях, когда метод явно требует в качестве параметра ObjectIdCollection или возвращает ObjectIdCollection.
2) Когда в силу ограниченности AutoCAD .NET API может понадобится воспользоваться P/Invoke с методом, который получает в качестве параметра AcDbObjectIdArray.
Кстати, AcDbObjectIdArray - это просто динамический массив, элементы которого AcDbObjectId
Ну, эти случаи очевидны. Я спрашивал о том, когда мне целесообразней использовать их именно в своём коде.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 14:56:29
Я подозреваю, что ObjectIdCollection был во времена .NET 2.0 где еще не было Generic List.
Он был еще во времена .NET 1.0 и 1.1 :-)
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Андрей Бушман от 13-11-2014, 14:56:51
Скорее для совместимости с ObjectARX (т.е. с native кодом на C++)
Спасибо.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 14:57:47
Я спрашивал о том, когда мне целесообразней использовать их именно в своём коде.
Сравни производительность. Думаю что в собственном коде это будет главным критерием.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Виктор Чекалин от 13-11-2014, 15:03:42
Он был еще во времена .NET 1.0 и 1.1 :-)
Точно generic? MSDN (http://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.80).aspx) говорит что минимальная версия - 2.0
Он точно не сразу появился.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Андрей Бушман от 13-11-2014, 15:07:26
Точно generic?
Нет. Полагаю, что А.Н. имел в виду ObjectIdCollection.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 15:09:02
Полагаю, что А.Н. имел в виду ObjectIdCollection.
Именно. Этот класс был и в AutoCAD 2005 и 2006, которые использовали .NET 1.0 и .NET 1.1 соотвественно.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Виктор Чекалин от 13-11-2014, 15:19:38
Именно. Этот класс был и в AutoCAD 2005 и 2006, которые использовали .NET 1.0 и .NET 1.1 соотвественно.
Пардон. Не так понял.
Но суть не меняется. Сначала был ObjectIdCollection, когда появился типизированный список, то стали использовать его.
Название: Re: ObjectIdCollection или List<ObjectId>?
Отправлено: Александр Ривилис от 13-11-2014, 15:31:14
Сначала был ObjectIdCollection, когда появился типизированный список, то стали использовать его.
Так как большинство классов и методов этих классов в AutoCAD .NET API (в отличие от Revit API) являются обертками над native классами и их методами в ObjectARX, то с ними по прежнему приходится общаться через ObjectIdCollection, а не через типизированные списки.