Почему отражение в доступе защищенный/закрытый член класса в С#?
Разве это не безопасно для класса, почему рефлексия придается такой силе? Это anti-pattern?
Почему отражение в доступе защищенный/закрытый член класса в С#?
Разве это не безопасно для класса, почему рефлексия придается такой силе? Это anti-pattern?
Это необходимо для сценариев, таких как удаленный доступ, сериализация, материализация и т.д. Вы не должны использовать его вслепую, но обратите внимание, что эти средства всегда были доступны в любой системе (по сути, путем прямого обращения к памяти). Отражение просто формализует его и помещает элементы управления и проверки на пути, которые вы не видите, потому что вы, по-видимому, используете "полное доверие", поэтому вы уже сильнее, чем система, которая защищена.
Если вы попробуете это с частичным доверием, вы увидите гораздо больше контроля над внутренним состоянием.
Это анти-шаблон?
Только если ваш код использует его ненадлежащим образом. Например, рассмотрим следующее (действительное для WCF-контракта):
[DataMember]
private int foo;
public int Foo { get {return foo;} set {foo = value;} }
Неправильно ли для WCF поддерживать это? Я подозреваю, что нет... существует несколько сценариев, в которых вы хотите сериализовать то, что не является частью публичного API, без отдельного DTO. Аналогично, LINQ-to-SQL будет реализовываться в частных членах, если вы так выбираете.
Доступность элемента не является функцией безопасности. Здесь защищает программиста от самого себя. Это помогает внедрить инкапсуляцию, но это отнюдь не функция безопасности.
Отражение достаточно утомительно для использования, чтобы люди обычно не пытались использовать его для доступа к непубличным членам. Это также довольно медленно. Отражение обычно используется только в особых случаях. Однако ничто не может полностью защитить от человеческой глупости, если кто-то хочет злоупотреблять размышлениями, он может легко это сделать, но даже без API отражения они могут достичь того же (если они работают в полном доверии, то есть), если они определяются достаточно.
Потому что он указан в спецификации ECMA, 9 метаданных.
Отражение абсолютно необходимо для отладчика. Представьте, что вы переходите через свою программу и не можете видеть значения ваших личных переменных. Вероятно, это причина, по которой отражение работает в .NET и Java, как это работает, чтобы сделать отладку очень простой.
Если нам не нужны отладчики, то я могу представить, что отражение будет больше ограничено в духе OOP.