Ответ 1
Атрибут имеет значение в случае, когда вы используете удаленный доступ, например класс, полученный из MarshalByRefObject. Затем ваш код работает с прокси-сервером в клиентской программе, поддельный объект класса, который выглядит точно так же, как и исходный класс, но методы которого реализованы в CLR и сериализуют аргументы метода для реального объекта, который выполняется на сервере. Обычно на другой машине.
Поля являются проблемой в таком классе, их нельзя подделать с помощью метода замены. Это то, с чем имеет дело дрожание. Когда он обнаруживает доступ к полю в объекте MRBO, он не генерирует код для непосредственного чтения и записи поля, вместо этого он вызывает вспомогательный метод в CLR. Кто знает, является ли объект прокси или реальным объектом и либо напрямую возвращает значение поля, либо делает удаленный вызов вместо этого.
Это добавляет накладные расходы, конечно, проблему со статическим полем, к которому можно получить доступ очень часто. Атрибут [ContextStatic] говорит, что вы не заботитесь о фактическом значении статического поля, его местная копия достаточно хороша. Или его можно использовать намеренно, если по какой-то причине важно следить за состоянием государства. Я не могу придумать хороший пример этого. Кроме того, разработчики фреймворка не использовали его внутри кода рамки.