从文档中:
用ContextStaticAttribute标记的静态字段不在上下文之间共享。如果在不同的上下文中访问指示的静态字段,它将包含不同的值。照原样使用此属性,不要从它派生。
以下示例显示了此属性的语法:
[ContextStatic] static int f=7;
不幸的是,在这种情况下,它没有阐明“上下文”的含义。有人可以举例说明何时使用此属性吗?
该属性在您使用远程处理的情况下很重要,例如从 MarshalByRefObject 派生的类。然后,您的代码将使用客户端程序中的代理,这是一个看起来与原始类完全一样的假类对象,但其方法由 CLR 实现,并将方法参数序列化到在服务器上运行的实际对象。通常在另一台机器上。
字段在此类中是一个问题,它们不能用替代方法伪造。这是抖动处理的问题。当它检测到对 MRBO 对象中的字段的访问时,它不会生成直接读取/写入字段的代码,而是调用 CLR 中的辅助方法。它知道对象是代理还是真实对象,要么直接返回字段值,要么进行远程调用。
这当然会增加开销,这是一个可以非常频繁地访问的静态字段的问题。[ContextStatic] 属性表示您不关心实际的静态字段值,它的本地副本就足够了。或者,如果出于某种原因在本地跟踪状态很重要,则可以有意使用它。我想不出一个很好的例子。框架程序员也没有,它没有在框架代码中的任何地方使用。
正如评论中所指出的,另请参阅部分中的文档确实指向远程上下文的文档,这使得以哪种方式进行挖掘更加清晰。
我自己能找到的关于该主题的最佳资源是http://blogs.msdn.com/b/tilovell/archive/2011/02/07/contextboundobject-part-1-making-contexts.aspx
简而言之 - 在 99% 的情况下,这个属性并不是乍一看。