Оффтопик. Изучаем C#

Автор Тема: Оффтопик. Изучаем C#  (Прочитано 100895 раз)

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

Оффлайн Рустем

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Последовательность выбора объекта
« Ответ #240 : 10-10-2021, 09:36:44 »
Здравствуйте. Подскажите почему если мы запишем BlockReference полученный из транзакции  в локальную переменную, а потом попытаемся обратиться к ней также через транзакцию уже в рамках другой функции, то появится ошибка, что объект не может быть открыт для чтения. Я решил для себя эту проблему, просто использую EntityResult.ObjectId из GetEntity. Но как говорится в рамках спортивного интереса. Это тонкости работы CLR или тонкости работы Net??

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #241 : 10-10-2021, 11:12:23 »
попытаемся обратиться к ней также через транзакцию
Это как?
Общее правило - нигде и никогда не хранить никаких объектов, полученных из транзакции (в смысле, вне тела транзакции не хранить). Их хранит транзакция. Если функция маленькая и вызывается часто, то можно передать в нее саму транзакцию и снова получить тот же объект из транзакции - получите ссылку на тот же самый объект, а не новый Entity, никаких выделений памяти и потерь времени. Если надо передавать объекты - то передавайте и храните ObjectId.

Оффлайн Рустем

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Последовательность выбора объекта
« Ответ #242 : 10-10-2021, 18:24:00 »
Спасибо за ответ avc. Доступно и понятно. В LISP и VBA таких проблем нет, вот я и удивился. Вот скажем я получил BlockReference, из него BlockTableRecord из него выбрал AttributeReference посредством GetObject.  И вот я добрался до заветных полей "Tag" и  "TextString" и т.д. и все это в рамках одной транзакции. Получается мне нельзя эти поля сохранить, чтобы обратиться к ним из другой функции. В другой функции мне придется опять спускаться из ObjectId. Я не против, правила есть правила, но ведь как то это не совсем то. Вместо одной операции целых четыре. Видимо есть путь получить ссылки на атрибуты не используя транзакцию, записать все поля, потом уже обратиться к ним с использованием транзакции.

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

  • Administrator
  • *****
  • Сообщений: 13072
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Оффтопик. Изучаем C#
« Ответ #243 : 10-10-2021, 18:30:04 »
И вот я добрался до заветных полей "Tag" и  "TextString" и т.д. и все это в рамках одной транзакции. Получается мне нельзя эти поля сохранить, чтобы обратиться к ним из другой функции.
Ну почему же нельзя. Указанные вами поля имеют тип string - строки можно сохранить. А вот сами наследники DBObject вне рамок транзакции невалидны.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 735
  • Карма: 149
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #244 : 10-10-2021, 18:40:40 »
А я и не писал, что нельзя ПЕРЕДАВАТЬ. Нельзя СОХРАНЯТЬ. То есть в какой-то хелпер передать вполне можно. Главное, чтоб объект не сохранился ни в каких списках и полях класса после того, как уничтожена транзакция. Обращение к объекту уничтоженной транзакции - это гарантированный фатал Автокада. Но если вы уверены что ваш метод не оставит ссылок на Entity где-то во вне, то смело можете передавать. То что вы описываете - вполне можно делать с Entity пока не закрыта транзакция.
Извлечение атрибута из транзакции по его Id - это одна операция, а не 4. Почему бы и не передать его Id ?  ObjectId атрибута - это по сути и есть ссылка на атрибут. не такая прямая как вам хочется, зато безопасная.