doronin.m
Вот спасибо отличная идея на счет гуида )
недавно тоже над похожим вопросом бился, думал откуда взять уникальные ID для объектов...
Не знаю как у тебя получается в твоём примере одинаковый хэшкод.Он должен быть разным,даже если ты укажешь в структурах одинаковые значения.Дефолтный хэшкод берётся из адреса в оперативной памяти базового класса для структуры.То есть у Object.По-этому если не переопределить GetHashCode(),то для двух объектов всегда будет разный хешкод,независимо от их значений.У тебя какой то глюк.Но это если ты создаёшь структуру с помощью new.То есть ты помещаешь структуру в кучу, а ссылку на неё в стек.
Другое дело,когда ты создаёшь структуру как положено.Без new.Тогда она вся помещается на стек,так как структура по своей сути не ссылочный тип,а тип значений.Вот здесь начинаются интересности,связанные с особенностями функционирования стека.Для оптимизации памяти,когда в стек помещается объект,проверяется,есть ли уже такой.Если есть,то просто увеличивается счётчик.Новый объект не создаётся.Если такого нет,то создаётся.Следовательно,когда ты в стеке берёшь две одинаковые структуры и сравниваешь их хэшкод,он будет одинаковым,так как у их Object один и тот же адрес.Если у структуры изменить какое то поле,то она уже помещается на новое место,а в том счётчик уменьшается.По-этому у двух струтур с одинаковыми значениями будет одинаковый хэш код,а у разных разный.Даже не нужно переопределять GetHashCode().
Вообще использовать структуру с new не имеет особого смысла.Они оставлены в C# только для оптимизации,причём в отличии от С++ они не являются аналогами классов.Они как тип значений распологаются на стеке,а следовательно доступ к ним осуществляется напрямую,не через ссылку и значит быстрее.Плюс не создаётся в куче сложная инфраструктура для хранения.
Foo f;
f.x=1;
f.y=2;
f.flag=true;
Если создавать структуру через new,то теряются все преимущества структуры.