22

System.Windows.Threading.DispatcherObjectクラス (に基づくDependencyObject) にはCheckAccess()、コードが UI スレッドで実行されているかどうかを判断する、 と呼ばれる便利な関数が含まれています。

昨日それを使用したかったときVerifyAccess()、MSDN ライブラリにリストされているにもかかわらず、Intellisense が関数 (UI スレッド上にないときに例外をスローする も) を表示しないことに戸惑いました。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 で最も便利なメソッドのように) ?

4

2 に答える 2

9

Microsoft の従業員は最近、 CheckAccess は「高度なシナリオ」でのみ使用されるため、Intellisense からは隠されていると述べました。

「CheckAccess と VerifyAccess は常に表示されないようにマークされています。IntelliSense がそれを尊重していなかった可能性があります。Reflector を使用して確認できます。ここでの考え方は、CheckAccess と VerifyAccess は高度なシナリオであり、通常の開発者は必要としないということです。

ただし、EditorBrowsableState.Advanced の方が適切なレベルだったと思います。」

この欠点については、Microsoft Connect ケースがあります。それがあなたにとって重要である場合は、それに投票してください。

于 2008-10-01T14:59:31.647 に答える
0

これらのメソッドを直接使用するべきではないというドキュメントは見つかりませんが、あまり長くは調べていません。

また、存在しないEditorVisibleAttributeを参照します。Reflectorによると、これはEditorBrowsableAttributeです。

リフレクターの分解:

[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}
于 2008-08-20T07:22:02.960 に答える