2008-08-20 50 views
20

System.Windows.Threading.DispatcherObject類(其中DependencyObject基於此類)包含一個有用的函數,稱爲CheckAccess(),用於確定代碼是否在UI線程上運行。爲什麼從Intellisense隱藏DispatcherObject.CheckAccess()和VerifyAccess()?

當我昨天想要使用它時,即使MSDN庫列出它,我也很困惑地​​發現Intellisense沒有顯示該功能(也不是在UI線程中引發異常的VerifyAccess())。我決定使用反射器來研究這個類。看來這個函數有一個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中一些最有用的方法)?

回答

8

微軟員工recently stated的checkAccess僅用於「高級場景」,所以他們把它藏從智能感知。

「的checkAccess和VerifyAccess已 總是被標記爲不可見, 也許是智能感知不尊重 它。你可以使用反射來確認。 這裏的想法是,和的checkAccess VerifyAccess是進步的方案, 正常的開發人員不需要。

不過,我認爲 EditorBrowsableState.Advanced將 是一個比較合適的水平。」

這個缺點有一個Microsoft Connect案例。 Vote for it如果它對你很重要。

+0

上面列出的Microsoft Connect頁面不再可用。這裏有一個新的報告,如果有人想繼續遊說以改變這一點:https://connect.microsoft.com/VisualStudio/feedback/details/3133453 – 2017-05-03 18:09:09

0

我找不到任何說你不應該直接使用這些方法的文檔,但我看起來並沒有很長。

另外您還引用了EditorVisibleAttribute,它不存在。根據Reflector,它是EditorBrowsableAttribute

反射拆解:

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