Здравствуйте, _NN_, Вы писали:
_NN>А есть также поддержка Include, Exclude как в оригинальном макросе ?
Откровенно говоря — хреновая концепция от которой можно отказаться.
Вот что реальено нужно — это режим работы не с исключениями, а задающий поля для сравнения (ключевые поля). А то бывает что в ключ попадает только 1-3 поля и приходится на все остальные навешивать Ignor-ы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
А>Это и есть оригинальный, только изменил генерацию хешкода на существенно более лучшую (использовал умножение)
Интересно было бы сравнить количество возникающих колизий в реальном Dictionary/HeshSet. А то я сколько не смотрел все эти алгоритмы давали неплохую уникальность хэша, но на практике, при делении его на число элементов все равно появлялись коллизии.
А>и немного оптимизировал генерируемый код. Кроме того добавил приват поле хешкода генерируемое если неизменяемых значений 7 и более.
Хм. А если объект изменяемый? Ну, скажем у нас неизменяемое поле ссылающееся на List<T>?
Кроме того это поведение должно быть отключаемым. И на это поле нужно навешивать разные маро-атрибуты чтобы его Record и прочие макросы не хватали.
А>Так я не понял. Размещение процедурн в другом неймспейсе? какой профит. Мне что бы понять не хватает знаний.
Лично я тоже не понял. Странное предложение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
_NN>WithoutName.AEqualityComparer().Equals(a, b) == true
_NN>WithoutField.AEqualityComparer().Equals(a, b) == false
_NN>Default.AEqualityComparer().Equals(a, b) == false
_NN>
На мой взгляд — какой-то овердизайн.
Тогда уж нужно создать отдельный макрос генерирющий компораторы, а не этот во всемогутер превращать. Общие части, конечно, в библиотеку нужно вынести будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
1. Добавлены свойства атрибутов AllIgnore = true — игнорировать все поля. Поля для использования должны быть помечены как [EqualsNotIgnore] или указаны в атрибуте класса как NotIgnore
2. Добавлена возможность указать поля вариантов NotIgnore = A.name
3. добавлена возможность отключить создание неизменяемых кусков с помощью указания WhenGenerateCashField необходимого минимального числа числа константных полей. К константным полям относятся неизменяемые примитивные типы и строки. по умолчанию значение 7.
4. Произведен отказ от использования лямбд.
5. Немного сокращен генерируемый код
Сделал пулреквест
Re[7]: Nemerle.Extensions1
От:
Аноним
Дата:
12.08.13 17:56
Оценка:
Здравствуйте, VladD2, Вы писали:
[StructuralEquality(Ignore = name, NotIgnore = A.name, AllIgnore = true)]
variant X
{
| A { name : string; name2 : string; other : int; }
| B { name : string }
| C {
[EqualsNotIgnore] a1:int;
[EqualsNotIgnore] a2:int;
[EqualsNotIgnore] a3:int }
}
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, VladD2, Вы писали:
А>1. Добавлены свойства атрибутов AllIgnore = true — игнорировать все поля. Поля для использования должны быть помечены как [EqualsNotIgnore] или указаны в атрибуте класса как NotIgnore
Лучше переименовать EqualsNotIgnore в Key, режим в режим Explicit (и без " = true").
А>2. Добавлена возможность указать поля вариантов NotIgnore = A.name
NotIgnore тоже не очень очевидно. Лучше опять же Key=A.name или keys=A.name.
А>3. добавлена возможность отключить создание неизменяемых кусков с помощью указания WhenGenerateCashField необходимого минимального числа числа константных полей. К константным полям относятся неизменяемые примитивные типы и строки. по умолчанию значение 7.
Не смог распарсить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.