ObjectIdCollection или List<ObjectId>?

Автор Тема: ObjectIdCollection или List<ObjectId>?  (Прочитано 12065 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
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. // ...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #1 : 13-11-2014, 14:38:40 »
Равнозначны ли оба приведённые ниже варианта работы с коллекцией ObjectId или же вариант с ObjectIdCollection имеет какие-то преимущества?
Ну как минимум в той форме записи, которую ты указал при выходе из блока using будет вызван items.Dispose(), что явно укажет сборщику мусора, что можно освободить память.
С точки зрения производительности обоих методов - нужно тестировать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #2 : 13-11-2014, 14:43:26 »
при выходе из блока using будет вызван items.Dispose()
Это я понимаю. Не понимаю, зачем этот класс реализует IDisposable. Я предпочитаю использовать List<Db.ObjectId>. В каких случаях мне всё же лучше использовать ObjectIdCollection?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #3 : 13-11-2014, 14:53:43 »
Я подозреваю, что ObjectIdCollection был во времена .NET 2.0 где еще не было Generic List. Для совместимости оставили. В Revit API тоже потихоньку переводят коллекции на типизированные списки.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #4 : 13-11-2014, 14:54:08 »
Не понимаю, зачем этот класс реализует IDisposable.
Ну это вопрос к инженерной команде AutoCAD.

В каких случаях мне всё же лучше использовать ObjectIdCollection?
Мне известно как минимум два случая:
1) В тех случаях, когда метод явно требует в качестве параметра ObjectIdCollection или возвращает ObjectIdCollection.
2) Когда в силу ограниченности AutoCAD .NET API может понадобится воспользоваться P/Invoke с методом, который получает в качестве параметра AcDbObjectIdArray.
Кстати, AcDbObjectIdArray - это просто динамический массив, элементы которого AcDbObjectId
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #5 : 13-11-2014, 14:55:01 »
Для совместимости оставили.
Скорее для совместимости с ObjectARX (т.е. с native кодом на C++)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #6 : 13-11-2014, 14:56:05 »
Мне известно как минимум два случая:
1) В тех случаях, когда метод явно требует в качестве параметра ObjectIdCollection или возвращает ObjectIdCollection.
2) Когда в силу ограниченности AutoCAD .NET API может понадобится воспользоваться P/Invoke с методом, который получает в качестве параметра AcDbObjectIdArray.
Кстати, AcDbObjectIdArray - это просто динамический массив, элементы которого AcDbObjectId
Ну, эти случаи очевидны. Я спрашивал о том, когда мне целесообразней использовать их именно в своём коде.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #7 : 13-11-2014, 14:56:29 »
Я подозреваю, что ObjectIdCollection был во времена .NET 2.0 где еще не было Generic List.
Он был еще во времена .NET 1.0 и 1.1 :-)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #8 : 13-11-2014, 14:56:51 »
Скорее для совместимости с ObjectARX (т.е. с native кодом на C++)
Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #9 : 13-11-2014, 14:57:47 »
Я спрашивал о том, когда мне целесообразней использовать их именно в своём коде.
Сравни производительность. Думаю что в собственном коде это будет главным критерием.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #10 : 13-11-2014, 15:03:42 »
Он был еще во времена .NET 1.0 и 1.1 :-)
Точно generic? MSDN говорит что минимальная версия - 2.0
Он точно не сразу появился.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #11 : 13-11-2014, 15:07:26 »
Точно generic?
Нет. Полагаю, что А.Н. имел в виду ObjectIdCollection.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #12 : 13-11-2014, 15:09:02 »
Полагаю, что А.Н. имел в виду ObjectIdCollection.
Именно. Этот класс был и в AutoCAD 2005 и 2006, которые использовали .NET 1.0 и .NET 1.1 соотвественно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #13 : 13-11-2014, 15:19:38 »
Именно. Этот класс был и в AutoCAD 2005 и 2006, которые использовали .NET 1.0 и .NET 1.1 соотвественно.
Пардон. Не так понял.
Но суть не меняется. Сначала был ObjectIdCollection, когда появился типизированный список, то стали использовать его.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: ObjectIdCollection или List<ObjectId>?
« Ответ #14 : 13-11-2014, 15:31:14 »
Сначала был ObjectIdCollection, когда появился типизированный список, то стали использовать его.
Так как большинство классов и методов этих классов в AutoCAD .NET API (в отличие от Revit API) являются обертками над native классами и их методами в ObjectARX, то с ними по прежнему приходится общаться через ObjectIdCollection, а не через типизированные списки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение