Класс System.Windows.Threading.DispatcherObject
(на котором основан DependencyObject
) содержит полезную функцию, называемую CheckAccess()
, которая определяет, выполняется ли код в потоке пользовательского интерфейса.
Когда я хотел использовать его вчера, я был озадачен, узнав, что Intellisense не показывал функцию (и VerifyAccess()
, которая генерирует исключение, если не в потоке пользовательского интерфейса), хотя библиотека 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)?