为什么DispatcherObject.CheckAccess()和VerifyAccess()隐藏在Intellisense中?

时间:2008-08-20 07:07:30

标签: .net-3.5 intellisense

System.Windows.Threading.DispatcherObject类(DependencyObject所基于的)包含一个有用的函数,称为CheckAccess(),它确定代码是否在UI线程上运行。

当我想在昨天使用它时,我很困惑地发现Intellisense没有显示该函数(也不是VerifyAccess(),它在不在UI线程上时抛出异常),即使MSDN库列出来。我决定使用Reflector调查这个类。似乎有问题的函数附加了EditorBrowsable(EditorBrowsableState.Never)属性。 Dispatcher使用的DispatcherObject类具有与CheckAccess()VerifyAccess()相同的属性:

public abstract class DispatcherObject
{
    // ...

    [EditorBrowsable(EditorBrowsableState.Never)]
    public bool CheckAccess();
    [EditorBrowsable(EditorBrowsableState.Never)]
    public void VerifyAccess();

    // ...

    [EditorBrowsable(EditorBrowsableState.Advanced)]
    public Dispatcher Dispatcher { get; }
}


public sealed class Dispatcher
{
    // ...

    [EditorBrowsable(EditorBrowsableState.Never)]
    public bool CheckAccess();
    [EditorBrowsable(EditorBrowsableState.Never)]
    public void VerifyAccess();

    // ...
}

我不相信该属性的应用是随机的(或笑话),所以我的问题是:它为什么存在?这些方法不应该直接调用吗?那么他们为什么不是protected(或internal,就像WPF中一些最有用的方法一样?)

2 个答案:

答案 0 :(得分:8)

Microsoft员工recently stated CheckAccess仅用于“高级方案”,因此他们将其隐藏在Intellisense中。

  

“CheckAccess和VerifyAccess有   始终被标记为不可见,   也许IntelliSense不尊重   它。您可以使用Reflector进行确认。   这里的想法是CheckAccess和   VerifyAccess是高级方案,   普通开发人员不需要。

     

然而,我确实这么认为   EditorBrowsableState.Advanced会   是一个更合适的水平。“

这个缺点有一个Microsoft Connect案例。 Vote for it如果这对你很重要。

答案 1 :(得分:0)

我找不到任何说明你不应该直接使用这些方法的文档,但我看起来不长。

您也可以参考不存在的EditorVisibleAttribute。根据Reflector,它是EditorBrowsableAttribute

Reflector disassembly:

[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}