Почему отражение доступа защищенного / частного члена класса в C #? - PullRequest
18 голосов
/ 18 января 2010

Почему отражение доступа защищено / закрыто для члена класса в C #?

Разве это не безопасно для класса, почему рефлексия получает такую ​​силу? Это анти-паттерн ?

Ответы [ 3 ]

22 голосов
/ 18 января 2010

Доступ к элементу не является функцией безопасности. Он предназначен для защиты программиста от самого себя. Это помогает реализовать инкапсуляцию, но ни в коем случае не является функцией безопасности.

Отражение достаточно утомительно, чтобы использовать его, чтобы люди обычно не старались использовать его для доступа к закрытым пользователям. Это также довольно медленно. Отражение обычно используется только в особых случаях. Однако ничто не может полностью защитить от человеческой глупости, если кто-то хочет злоупотреблять отражением, он может легко это сделать, но даже без API отражения они могут достичь того же (если они работают с полным доверием) определены достаточно.

19 голосов
/ 18 января 2010

Это необходимо для таких сценариев, как удаленное взаимодействие, сериализация, материализация и т. Д. Вы не должны использовать его вслепую, но учтите, что эти средства всегда были доступны в любой системе (по сути, путем обращения к память напрямую). Отражение просто формализует его и помещает элементы управления и проверки таким образом, чего вы не видите, потому что вы, по-видимому, работаете с «полным доверием», поэтому вы уже сильнее, чем защищаемая система.

Если вы попробуете это с частичным доверием, вы увидите гораздо больший контроль над внутренним состоянием.

Это анти-паттерн?

Только если ваш код использует его не по назначению. Например, рассмотрим следующее (действительно для контракта данных WCF):

[DataMember]
private int foo;

public int Foo { get {return foo;} set {foo = value;} }

Неправильно ли WCF поддерживать это? Я подозреваю, что нет ... есть несколько сценариев, в которых вы хотите сериализовать что-то, что не является частью общедоступного API, без отдельного DTO. Аналогично, LINQ-to-SQL материализуется в частные члены, если вы выберете это.

0 голосов
/ 18 января 2010

Отражение абсолютно необходимо для отладчика. Представьте, что вы проходите через свою программу и не можете видеть значения ваших личных переменных. Возможно, именно поэтому рефлексия работает в .NET и Java так, как она работает, чтобы сделать отладку действительно простой.

Если бы нам не понадобились отладчики, тогда я могу себе представить, что отражение будет ограничено в большей степени в духе ООП .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...