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