这是什么? [领域:安全关键]

6

查看 Reflector 反编译的 System.Windows.Threading.Dispatcher 后,我发现:

[field: SecurityCritical]
public event DispatcherUnhandledExceptionFilterEventHandler UnhandledExceptionFilter;

我不认识属性声明中的“field”部分,这是什么意思?
编辑:
这是在参考来源中的显示方式:
    public event DispatcherUnhandledExceptionFilterEventHandler UnhandledExceptionFilter
    { 
        [SecurityCritical] 
        [UIPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)]
        add 
        {
            _unhandledExceptionFilter += value;
        }
        [SecurityCritical] 
        [UIPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)]
        remove 
        { 
            _unhandledExceptionFilter -= value;
        } 
    }
4个回答

6

这意味着它将属性应用于支持事件的代理,而不是事件本身。

就像属性语法一样是一种简写方式,代码

event MyDelegate MyEvent;

实际上是简写形式

MyDelegate _BackingDelegate;

event MyDelegate MyEvent
{
    add { lock (this._BackingDelegate) this._BackingDelegate += value; }
    remove { lock (this._BackingDelegate) this._BackingDelegate -= value; }
}

据我所知,该属性适用于_BackingDelegate而不是MyEvent

*注:我不确定是否有lock语句,但我认为有。


是的,我刚刚查看了参考源代码,事实上该特性应用于添加和删除访问器。 - Grokodile
@panamack:等等,什么?它应用于访问器还是字段本身?! - user541686
@panamack:我有点困惑,但无论如何,如果我说的与实际情况相反,请告诉我...虽然我相当确定这是正确的... - user541686
@Mehrdad,我猜想由于Reflector是从IL反编译的,所以根据原始代码的编译方式,它可能会将其解释为应用于字段,尽管在编写时它是应用于事件访问器的,不过这只是我的猜测。 - Grokodile
@panamack:是的,我不知道,检查一下 ILDASM 可能是个好主意。 - user541686

3

违背投票的趋势,这实际上回答了我的问题,“field”是什么,而且你比Alex更早回答了,所以你赢了 :) - Grokodile
@panamack - 不确定“Alex”是否指的是我,但我先回答了。如果你将鼠标悬停在“X小时前回答”的上方,你会看到确切的时间戳。比较时间戳即可。 - Alex Aza
@Alex,享受你的道德胜利;p。 - Grokodile
@panamack - 这是什么意思? - Alex Aza

3
属性目标的语法如下所示:
[target : attribute-list]

其中target是以下内容之一:程序集(assembly)、字段(field)、事件(event)、方法(method)、模块(module)、参数(param)、属性(property)、返回值(return)、类型(type)。

您可以在此处找到可能的所有目标的完整列表:Disambiguating Attribute Targets

SecurityCritical不能应用于事件,但可以应用于支持的EventHandler字段。


1

当您为事件声明属性时,可以选择将属性应用于事件本身或保存事件委托的字段以生成addremove方法。指定符field表示该属性应用于字段。

请参阅MSDN上的消除歧义的属性目标以及此问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接