Используете уникальные идентификаторы для объектов?
Работал с самописной коллекцией объектов, у каждого из которых была модель и представление. Байндингов нет, т.к. не охота заморачиваться их реализацией в самописных контролах. При операциях добавления-удаления представлений стали почему-то выкидываться исключения, что представления для удаления не найдены, хотя мне казалось, что они точно были в коллекции - ведь данные отображаются те же. При удалении представлений я сравниваю их по ссылке. Смотрю под дебагом - модели у представлений одинаковые, данные в них одинаковые, почему считает, что это разные представления и ссылки на них не равны? Оказалось, что при определённых условиях коллекция создаёт новые представления с теми же моделями, потому и данные отображаются одинаковые. Но пока не добавил уникальные идентификаторы для представлений, не смог понять это.
Если бы сравнивал представления не по ссылке, а скажем по значениям моделей (в моделях есть свои уникальные идентификаторы), то всё бы работало, баг бы не проявлялся. Только память бы постепенно утекала.
вообще непонятно, как пришла идея сравнивать без ИД. А что выбрать в качестве ИД - это уже другой вопрос
Сама ссылка на объект и есть вполне себе уникальный айди.
вообще непонятно, как пришла идея сравнивать без ИД
А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?
Сама ссылка на объект и есть вполне себе уникальный айди.
смотря что под этим понимать. Вначале должно быть определение, какие два объекта будут считаться одинаковыми.
Вот сделал я клон моего объекта - это одинаковые объекты или разные?
А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?
Если класс "сидит" в базе, то скорее всего да. Но всегда есть исключения
Вначале должно быть определение, какие два объекта будут считаться одинаковыми.
Вот сделал я клон моего объекта - это одинаковые объекты или разные?
Две ссылки на один и тот же объект - это одинаковый объект. Тут-то разногласий не будет? Железное определение.
if (myIsland == yourIsland) throw new Exception();
А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?Если класс "сидит" в базе, то скорее всего да. Но всегда есть исключения
Вы слишком далеко копаете, в базы какие-то лезете. Всё проще. У меня во вьюшном списке сидели представления, и по-ошибке могли создаться несколько вьюх на одну и ту же модель в одном и том же списке. А не должны были. Там при одной операции одна вьюха удалялась, а другая создавалась, так что внешне казалось, что нужный объект всё ещё в списке. А внутри списка я храню ссылку на удалённую из списка вьюху. Выбираю оставшуюся вьюху, которая видна в списке, сравниваю с сохранённой, и должен удалить, если они равны - а они не равны.
Я пишу свой контрол для коллекций представлений. Среди прочего он должен запоминать выбранный объект. А также пытаюсь реализовать операцию обмена объектами между разными коллекциями. Я сделал для своей коллекции пока добавление и удаление как "атомарные" операции - т.е. происходят полностью внутри коллекции. А вот обмен, это когда из другой коллекции тащат предмет в мою коллекцию. Тогда моя коллекция должна отдать свой предмет и принять чужой. Если делать это как две последовательные атомарные операции - сначала удалить свой объект, потом принять чужой, то вот ошибка такая возникла. А реализовать обмен как отдельную атомарную операцию пока не придумал как. Да и не охота - придумал workaround через две простых, найдя описанную в начале ошибку и исправив.
Сама ссылка на объект и есть вполне себе уникальный айди.
------
С чего бы это? особенно с учетом возможной автоматической выгрузки/загрузки объектов...
В одном списке количества объектов все равно меньше, чем в реальности. А теперь представьте комбинацию объектов и их трансформацию какое решение из этого вышло? Причем по некоторым объектам повторений то есть копий клонов ещё больше. Какое решение из этого вышло?
Второй вопрос по оптимизации приложений, почему вообще тут в Германии все работает с ошибками? В России и других странах бывшего постсовета у меня все чисто, а здесь полный бардак.
Сама ссылка на объект и есть вполне себе уникальный айди.
------
С чего бы это? особенно с учетом возможной автоматической выгрузки/загрузки объектов...
Найдите второй объект с такой же ссылкой. А вот всякие айдишники могут дублироваться - я же могу несколько объектов представлений иметь, которые будут содержать одну и ту же модель, а значит и айдишник, который она из базы данных или ещё откуда берёт.
Выгрузка загрузка - что вы имеете ввиду? Даже если адрес объекта обновится, то ссылка на него обновится у всех.
Для этой задачи мне нужно не сравнение по логике, а сравнение по физическому присутствию, если можно так выразиться. Для моделей пойдёт сравнение по логике (чтобы айдишники были одинаковые).
Но вообще я другое имел ввиду под айдишниками для объектов. Я имел ввиду что-то типа
MyClass
{
static ulong idCounter = 0;
ulong id;
public MyClass() { id = idCounter++; }
}
Когда я увидел под дебагом, что представления не равны, хотя подлежащие модели равны, то не поверил. Решил проверить, добавив такие айдишники, чтобы лишний раз убедиться, что это действительно разные представления с разными айди.
Да это вообще старый приём с приписанными айдишниками к каждому объекту. Не понимаю, что все удивляются и цокают языками. )))
В одном списке количества объектов все равно меньше, чем в реальности. А теперь представьте комбинацию объектов и их трансформацию какое решение из этого вышло? Причем по некоторым объектам повторений то есть копий клонов ещё больше. Какое решение из этого вышло?
Второй вопрос по оптимизации приложений, почему вообще тут в Германии все работает с ошибками? В России и других странах бывшего постсовета у меня все чисто, а здесь полный бардак.
Вы дескредитируете ИИ. С таким низкокачественным ИИ технологическая сингулярность никогда не наступит, и кожаные мешки всегда будут говнокодить и понукать вами, непризнанными железными гениями.
Железное определение.
Абсолютно
https://onecompiler.com/csharp/42wws4jdp
Вы слишком далеко копаете
Вопрос - Используете уникальные идентификаторы для объектов
Найдите второй объект с такой же ссылкой.
------
довольно давно описывал нерегулярно возникавшую ошибку с занулением объекта.
https://onecompiler.com/csharp/42wws4jdp
У вас как раз моя ситуация - модель одна и та же (у вас просто данные скопированы), а инстансы представлений разные.
Если айди по смыслу должен иметь уникальный номер на инстанс, то не должно быть конструктора, копирующего этот айди. Каждый раз он должен присваиваться новый. У меня кстати счётчик айди простого типа (ulong) и статический, что по его природе уже гарантируют атомарность приращения и потокобезопасность. А значит и уникальность айди, если его задавать так
id = idCounter++;
Если айди по смыслу должен иметь уникальный номер на инстанс,
Не по смыслу, а так вам надо
Ну например так
Console.WriteLine($"Instance1 ID: 0x{RuntimeHelpers.GetHashCode(instance1):X8}");
Console.WriteLine($"Instance1 ID: 0x{RuntimeHelpers.GetHashCode(instance2):X8}");
Вариантов еще море
что по его природе уже гарантируют атомарность приращения и потокобезопасность. А значит и уникальность айди, если его задавать так
id = idCounter++;
Нет.
internal class Program { private static ulong idCounter = 0; static void Main(string[] args) { Task[] tasks = new Task[10]; for (int j = 0; j < tasks.Length; j++) { tasks[j] = Task.Factory.StartNew(Increment); } Task.WaitAll(tasks); Debug.WriteLine($"Counter: {idCounter}"); } private static void Increment() { for (int i = 0; i < 10000; i++) { idCounter++; } } }
Как быть с указанием метабазы и текст генератора?
Да.
Зачем тогда какие то придурки сделали "Interlocked.Increment(ref сount);"?
Можно же ведь проще