|
2 / 2 / 2
Регистрация: 14.03.2017
Сообщений: 124
|
|
Почему оператор lock () предназначен только для ссылочных типов?06.07.2019, 12:25. Показов 8252. Ответов 23
Метки нет (Все метки)
0
|
|
| 06.07.2019, 12:25 | |
|
Ответы с готовыми решениями:
23
Каким образом выполняется оператор "+" для ссылочных типов, если один из операндов равен null
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||||
| 06.07.2019, 16:28 | ||||||||||||
|
Так же стоит обратить внимание, что lock — это конструкция конкретно языка C#, а не .NET или среды выполнения CLR, а спек как раз не накладывает никаких условий на то, как синхронизация должна быть реализована рантаймом: с блоком синхронизации в заголове объекта или с использованием отдельной таблицы замыкания — это каждая среда может реализовывать по-своему.Так что в контексте языка ваш ответ, к сожалению, неправильный. Вот что правила языка четко указывают, так это то, во что блок lock должен разворачиваться, а именно в такую конструкцию:
x вычисляется только один раз.Ну а поскольку методы Monitor.Enter и Monitor.Exit для замыкания принимают на вход переменную типа object, постольку попытка синхронизироваться на значимом типе не имеет смысла, т.к. при каждом вызове Enter и Exit будет производиться запаковка и как результат синхронизация будет проводиться каждый раз на новом экземпляре (а попытка вызова Exit вообще приведет к исключению).Что характерно, при прямом вызове Monitor.Enter с передачей туда значимого типа, никакой ошибки не возникает, просто такой вызов не имеет смысла. Однако я ни разу не удивлюсь если в будущих версиях фреймворка, а в будущем и языка, появится новая перегрузка Monitor.Enter/Exit, позволяющая замыкаться и на значимых типах:
3
|
||||||||||||
|
|
|||
| 06.07.2019, 19:47 | |||
|
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 06.07.2019, 19:59 | |||||
|
Если разрешить полиморфизм, то сколько памяти выделять под эту переменную? Можете хоть свою реализацию писать для какого-нибудь Линупса и работать с памятью как заблагорассудится. До тех пор, пока эта работа не противоречит спеку. Суть комментария была в том, что этот вопрос отдается на откуп среде выполнения и как-то странно деталь реализации какого-то определенного называть причиной наличия какого-то правила в языке.
0
|
|||||
|
|
||
| 06.07.2019, 20:05 | ||
|
Может это и есть ответ на ваш встречный вопрос? Нет, вы не думайте, что я тут докопаться решил. Просто я реально не понимаю, что написано в вашем длинном сообщении, и чем это противоречит тому, что написал я.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 06.07.2019, 20:15 | |||||
|
Память-то уже выделена под размер экземпляра родительского типа. И мы еще даже не начали обсуждать передачу таких переменных в методы: какого размера должен быть фрейм вызова? ![]() Докапывайтесь чаще и тщательнее — это всем только на пользу. Если спек требовал бы наличия такой возможности, то поменялась бы реализация рантайма.
0
|
|||||
|
|
|||||
| 06.07.2019, 20:25 | |||||
![]()
0
|
|||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||
| 06.07.2019, 20:54 | ||||||||
|
Память-то под переменную выделяется во время объявления этой переменной! Ну например:
Или все-таки производство подстраивается под конструкторскую задумку? ![]() Конкретно в CLR в конкретном .NET нет блока SyncBlock в значимых типах потому, что он там не нужен, т.к. спецификация языка не позволяет использовать значимые типы для синхронизации. Добавлено через 4 минуты Cupko, или вы предполагаете, что в какой-то момент был уже готовый CLR и когда создавался язык C#, то его создатели столкнулись с таким ограничением в рантайме и изменили спек соответствующим образом? Такое возможно, но хотелось бы какой-нибудь ссылки на первоисточник.
1
|
||||||||
|
|
||||
| 06.07.2019, 21:01 | ||||
|
Я в этом вопросе, конечно, загрубил. Получилось бы явно некрасиво с массивами и филдами, как вы говорите. Но всё зависит от реализации, как вы говорите ![]() ![]() Добавлено через 48 секунд
0
|
||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 06.07.2019, 21:08 | |||||||
|
А память нужно выделить до присваивания значения. Улавливаете? Память выделить нужно, а сколько выделять — неизвестно, т.к. значения с указателем на хедер ще нет. А значение записать невозможно потому, что неизвестен размер переменной.
0
|
|||||||
|
|
|||||||||||||
| 06.07.2019, 21:18 | |||||||||||||
Со значимыми типами всё понятно, потому что их инициализировать не нужно и туда пойдут дефолтные значения. Т.е. при
Я к тому что, размер можно высчитывать при каждом push/pop и выделение памяти под переменную тут вообще не понятно причем. На самом деле мы уже ерунду обсуждаем. Я понял ваш посыл. Надеюсь, вы поняли мой
0
|
|||||||||||||
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|||
| 06.07.2019, 21:41 | |||
|
если по адресу 4х байтовой структуры в стеке записать 32 байта, то мы скорее всего затрем кучу других данных. а в другое место записывать нельзя, потому что это стек
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||
| 06.07.2019, 21:41 | ||||
|
Если копать в дебри деталей реализации рантайма, то по факту память под все локальные выделяется в самом начале метода, но семантически — при объявлении.
0
|
||||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|||
| 06.07.2019, 21:47 | |||
|
Именно под ссылку. string - ссылочный тип. Добавлено через 5 минут Вроде Хейсберг говорил, код может выделять память как угодно, в том числе и в свободных регистрах процессора. На стек надеяться нет смысла.
0
|
|||
|
|
||||||
| 06.07.2019, 21:57 | ||||||
![]() Ладно, господа, всё это чисто риторически. Мы обсуждаем абсолютно неважные вещи: что бы было, если бы.
0
|
||||||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 06.07.2019, 21:58 | |
|
Cupko, имеется ввиду, что программист C# не имеет права угадывать, где у него в данную секунду будут находиться данные - в стеке, в регистрах процессора или вообще в куче.
Замыкания например в кучу переползают. Внезапно.
0
|
|
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 06.07.2019, 22:06 | |
|
Cupko, в нашей профессии есть важный момент - если ты думаешь, что что-то понимаешь, то не факт, что на самом деле понимаешь.
Поэтому рассуждать о стеке нет смысла. Это не правда.
0
|
|
|
|
||
| 06.07.2019, 22:09 | ||
|
amr-now, поэтому и есть ресурсы в виде этого форума. И я до сих пор здесь нахожусь только из-за того, что это помогает мне достичь понимания процессов в фреймворке.
0
|
||
| 06.07.2019, 22:09 | |
|
Помогаю со студенческими работами здесь
20
Особенность копирования данных для ссылочных типов Для чего предназначен оператор ^ Сравнение ссылочных типов Инкапсуляция ссылочных типов Особенности использования ссылочных типов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|