|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
pationЕвгенийВКстати, если так Код: c# 1.
То результат 2. Ешо одын отличий клас от структур! Нет, то же будет 5 А ты спытай! Структура унаследована от ValueType, у последнего переопределены оба метода, они и будут вызваны. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 13:49 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВ, базовые методы у стукрутуры GetHashCode и Equals ппц какие тормозные, по этому их лучше сразу переопределить, если будите их использовать в большом количестве. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 14:50 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
Roman Mejtes, Если нет полей, ссылочных типов, то довольно шустро. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 15:00 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
А что будет тут? И почему. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 15:21 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВpationпропущено... Нет, то же будет 5 А ты спытай! Структура унаследована от ValueType, у последнего переопределены оба метода, они и будут вызваны. сорь, неподумавши ляпнул ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 15:40 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВhVosttпропущено... Да, хеш будет вычислен от ссылки. Но опять таки, by design. А вот фик там :) Ссылка может поменяться после сборки мусора, но у одного и того объекта, на протяжении жизни хеш должен быть постоянным. Видимо ради экономии места, для вычисления хеша, используется тоже самое поле, что и для lock. Вот тут товарищ пишет (прилагая пруфлинки) что для ссылочных типов используется некий уникальный для каждого потока генератор хешей. Ну, и сохраняет его в SyncBlock'е. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 16:01 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Так правильно. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 16:12 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
Насколько я помню из книги Рихтера, еще за 2007 год, для того чтобы метод Equals заработал, надо обязательно переопределить метод GetHashCode. Всегда парами их надо переопределять. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 17:18 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
Захотел проверить, но что-то даже не компилируется Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 17:28 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Вот так будет то же самое: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Cat2Захотел проверить, но что-то даже не компилируется Всегда следует исходить из того, что публикуемый код написан на последней существующей (даже не поддерживаемой) версии языка. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 18:26 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныВот так будет то же самое: А вот так - совсем не то же самое: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
и так тоже: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Т.о. если полей нет, то вычислитель хэшкода на содержимое занимаемой памяти не смотрит. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 18:36 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
ЕвгенийВВидимо ради экономии места, для вычисления хеша, используется тоже самое поле, что и для lock. Да хеш будет лежать вместо индекса контекста синхронизации :) Я ж не имел в виду от значения ссылки ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 21:26 |
|
Задача на проф. пригодность
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныТ.о. если полей нет, то вычислитель хэшкода на содержимое занимаемой памяти не смотрит. Судя по исходникам ValueType и coreclr , получается такая картина: 1. Эта структура, как ни странно, не может использовать быстрые варианты вычисления хэшкода и эквивалентности: если вытащить рефлекшеном значение метода CanCompareBits , то он вернет false. Видимо, структура является неплотно упакованной, потому как другие причины такого значения (переопределенные GetHashCode и/или Equals, наличие полей ссылочного типа - полей нет вообще никаких) отпадают (вот нативный код реализации CanCompareBits ). 2. Из-за п.1 мы получаем сравнение в цикле полей, и вычисление хэшкода на основе полей. Но т.к. полей нет, то в цикл мы не входим, и из метода Equals выходим с значением true . И т.к. полей нет, то вычислитель хэшкода возвращает значение, установленное до цикла вычисления хэшкода - некий TypeId, полученный от MethodTable типа, и обработанный вот таким образом : Код: c# 1.
- т.е. всегда одинаковый для всех экземпляров структуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2019, 07:31 |
|
|
start [/forum/topic.php?fid=20&msg=39842393&tid=1398860]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
129ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 502ms |
0 / 0 |