Класс 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)?