|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
значит ли это что память переменной d не будет освобождена? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 16:36 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
и не понимаю зачем чз tmp сделано, все равно же finaly выполнится ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 16:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview и не понимаю зачем чз tmp сделано, все равно же finaly выполнится Написано же в комментарии listtoview память переменной d не будет освобождена? Как это она может быть не освобождена, если это структура? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу. В переменной d ничего, понятное дело, не поменялось. listtoview значит ли это что память переменной d не будет освобождена? Dispose не производит очистку памяти. Это просто метод с гарантией вызова при выходе из блока using. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:51 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу. Там нет боксинга. Просто внутри блока юзинг используется не сама структура, а её копия - вот оттуда и "странный" результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, Хм. И правда, боксинга нет, но это оптимизация компилятора. Правильно считать, то боксинг есть, ибо он тут по всем правилам быть должен. Соответственно поведение такое же, как если бы боксинг был. ((IDisposable)d).Dispose() -- эта хреновина однозначно приведёт к boxing структуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:52 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Хм. И правда, боксинга нет, но это оптимизация компилятора. Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит. Очень, кстати, важная тема, потому что если методы object не переопределять в структуре, то можно получить боксинг там, где его совсем не ждешь (например, если у тебя структура это key в Dictionary<>, или элемент в HashSet<>). Кое-что детально можно найти погуглив про инструкцию IL "constrained". ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:27 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит. Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса. using работает с интерфейсом IDisposable и про твою структуру ничего не знает. Соответственно, должен быть boxing, так как требуется приведение к IDisposable. Однако боксинга не происходит, это и есть оптимизация компилятора. Ноги у оптимизации растут из реализации IEnumerator для списков , которые являются структурами, чтобы не кушать память при foreach. fkthat Кое-что детально можно найти погуглив про инструкцию IL "constrained". Если ты заменишь using на C# код, в который using разворачивается (try/finally), ты увидишь boxing. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 06:12 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Коллеги, зачем введена переменная tmp? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:54 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview Коллеги, зачем введена переменная tmp? Это копия, чтобы гарантировать неизменность ссылки / значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:05 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
vb_sub Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец Да ничего он особо там не "распедалил" и толком ничего не пояснил. Характерен только странный наезд, типа лезете внуть дотнета ай-яй-яй! Вопросы плохие задаёте! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса. Вот, за интерфейс (особенно в случае с using) я действительно не уверен. Но в случае виртуального метода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: il 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Обрати внимание, что вызов один и тот же (строки 0012-0018 и 0020-0026), но, если верить талмуду, то боксинг, благодаря инструкции "constrained." будет только во втором случае. Я вот только в душе не знаю, как это реально проверить - вчера еще что-то об этом заморочился, но "правильного" способа так в голову и не пришло. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat как это реально проверить Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 12:38 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt listtoview Коллеги, зачем введена переменная tmp? Это копия, чтобы гарантировать неизменность ссылки / значения. да, это я понимаю наверное лучше noLock заюзать ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 14:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat fkthat как это реально проверить Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет. Вот такая тула есть, но я не пробовал :) https://www.codeproject.com/Articles/290247/BoxCop-Static-Assembly-Analyzer-tool ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Вот такая тула есть, но я не пробовал :) У этого индуса в профиле написано: "A .net developer since 4+ years". Очешуеть, я говорить-то только лет после 3 начал, а люди в 4 уже на дотнет пишут. Вот такой примитивнейший тестик: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
А теперь комментим перегрузку ToString() Код: c# 1.
Сразу видна разница, и видно, как эта разница с каждой итерацией растет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 16:24 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Вот такой примитивнейший тестик: А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 16:33 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat fkthat Вот такой примитивнейший тестик: А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось. Ну да, утиная оптимизация ) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 17:08 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну да, утиная оптимизация ) Вот тут несколько объясняется как это происходит: https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.opcodes.constrained?view=net-5.0 When a callvirt method instruction has been prefixed by constrained thisType, the instruction is executed as follows: If thisType is a value type and thisType implements method then ptr is passed unmodified as the 'this' pointer to a call method instruction, for the implementation of method by thisType. If thisType is a value type and thisType does not implement method then ptr is dereferenced, boxed , and passed as the 'this' pointer to the callvirt method instruction. Т.е., если в IL такое: Код: il 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:43 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat и у Foo есть своя реализация ToString, то CLR превращает callvirt в обычный call без боксинга. И не выполняет виртуальный вызов. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 23:25 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt, Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 00:59 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt, Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании Вовсе нет. Честно говоря, вопросы про наследование интерфейса структурой многих приводит в недоумение. Этот вопрос хороший в нет плане, что ты ожидаешь правильный ответ, но можешь проследить логику размышлений. Один из 20 человек может ответить на вопрос, чем отличается реализация GetHashCode() у классов и структур, так что -- это типа тоже унижение? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:11 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt чем отличается реализация GetHashCode() у классов и структур В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:34 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt чем отличается реализация GetHashCode() у классов и структур В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю. Зачем исходники дотнета? Это спека, вопрос же в принципиальном отличии, это довольно практический вопрос, а не какие-то там тонкие ньюансы для гуру. Можно поговорить о том как работает GetHashCode() для классов, в контексте строения экземпляра класса в памяти, но мало с кем до этого вообще доходит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:42 |
|
|
start [/forum/topic.php?fid=18&fpage=4&tid=1354589]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
25ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 149ms |
0 / 0 |