Используете уникальные идентификаторы для объектов?
Работал с самописной коллекцией объектов, у каждого из которых была модель и представление. Байндингов нет, т.к. не охота заморачиваться их реализацией в самописных контролах. При операциях добавления-удаления представлений стали почему-то выкидываться исключения, что представления для удаления не найдены, хотя мне казалось, что они точно были в коллекции - ведь данные отображаются те же. При удалении представлений я сравниваю их по ссылке. Смотрю под дебагом - модели у представлений одинаковые, данные в них одинаковые, почему считает, что это разные представления и ссылки на них не равны? Оказалось, что при определённых условиях коллекция создаёт новые представления с теми же моделями, потому и данные отображаются одинаковые. Но пока не добавил уникальные идентификаторы для представлений, не смог понять это.
Если бы сравнивал представления не по ссылке, а скажем по значениям моделей (в моделях есть свои уникальные идентификаторы), то всё бы работало, баг бы не проявлялся. Только память бы постепенно утекала.
Сама ссылка на объект и есть вполне себе уникальный айди.
смотря что под этим понимать. Вначале должно быть определение, какие два объекта будут считаться одинаковыми.
Вот сделал я клон моего объекта - это одинаковые объекты или разные?
А вы любой класс начинаете с добавления ему какого-то уникального идентификатора?
Если класс "сидит" в базе, то скорее всего да. Но всегда есть исключения
Вначале должно быть определение, какие два объекта будут считаться одинаковыми.
Вот сделал я клон моего объекта - это одинаковые объекты или разные?
Две ссылки на один и тот же объект - это одинаковый объект. Тут-то разногласий не будет? Железное определение.
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}");
Вариантов еще море
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++; } } }