Почему DispatcherObject.CheckAccess() и VerifyAccess() скрыты от Intellisense?
Класс 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)?
Ответы
Ответ 1
Недавно опубликованный сотрудник Microsoft CheckAccess используется только для "расширенных сценариев" , поэтому они скрыли его от Intellisense.
"CheckAccess и VerifyAccess имеют всегда были отмечены как невидимые, возможно, IntelliSense не уважает Это. Вы можете использовать Reflector для подтверждения. Идея здесь в том, что CheckAccess и VerifyAccess запускает сценарии, что нормальные разработчики не нуждаются.
Однако, я думаю, что EditorBrowsableState.Advanced будет были более подходящим уровнем".
В этом случае Microsoft Connect подходит для этого недостатка. Голосуйте за него, если это важно для вас.
Ответ 2
Я не могу найти документацию, в которой говорится, что вы не должны использовать эти методы напрямую, но я не выглядел очень долго.
Также вы ссылаетесь на EditorVisibleAttribute, который не существует. Согласно Reflector это EditorBrowsableAttribute.
Разбор рефлектора:
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}