Это звучит как отличный ответ.
с как у меня былспросил, но мой немного другой. Вопрос в том, почему ключевое слово volatile не разрешеноC#
по типамSystem.Double
а такжеSystem.Int64
, и т.д.?"
На первый взгляд, я ответил своему коллеге: «Ну, на 32-битной машине эти типы требуют, по крайней мере, двух тактов, чтобы войти в процессор, а платформа .Net намерена абстрагировать детали, специфичные для процессора. " На что он отвечает: «Это ничего не абстрагирует, если мешает использовать функцию из-за проблем, связанных с процессором!»
Он подразумевает, что специфичные для процессора детали не должны отображаться человеку, использующему фреймворк, который «абстрагирует» такие детали от программиста. Таким образом, фреймворк (или C #) должен абстрагировать их и делать то, что нужно, чтобы предлагать те же гарантии дляSystem.Double
и т. д. (будь то семафор, барьер памяти или что-то еще). Я утверждал, что фреймворк не должен добавлять накладные расходы семафора наvolatile
потому что программист не ожидает таких издержек с таким ключевым словом, потому что семафор не нужен для 32-битных типов. Большие издержки для 64-битных типов могут стать неожиданностью, поэтому лучше .NET Framework просто не разрешать это, и заставлять вас создавать свой собственный семафор для больших типов, если накладные расходы приемлемы.
Это привело к нашему исследованию того, что такое ключевое слово volatile. (видетьэто страница). На этой странице указано в примечаниях:
В C # использование модификатора volatile в поле гарантирует, что при любом доступе к этому полю используется VolatileRead или VolatileWrite.
Хммм .....VolatileRead
а такжеVolatileWrite
оба поддерживают наши 64-битные типы !! Мой вопрос, то есть
«Почему ключевое слово volatile не разрешено вC#
по типамSystem.Double
а такжеSystem.Int64
, и т.д.?"