Какой смысл иметь частные конструкторы, если вы можете получить к ним доступ с помощью рефлексии? - PullRequest
5 голосов
/ 15 ноября 2010

и, возможно, частные статические методы и свойства и т. Д.

Ответы [ 4 ]

7 голосов
/ 15 ноября 2010

Модификаторы доступа помогают управлять потоком программ. Они похожи на светофоры - вам не нужно подчиняться им, и в определенных ситуациях авторизованные игроки могут игнорировать их, но вы обычно хотите их уважать, потому что они заставляют все работать намного более гладко.

2 голосов
/ 15 ноября 2010

Отражение считается более мощным, чем обычно, способом доступа к вашим классам - рекомендуется запретить закрытый доступ для неконтролируемого кода - см. ReflectionPermission .

Без ReflectionPermission, код может использовать отражение для доступа только к публичные участники объектов. Код с ReflectionPermission и соответствующий ReflectionPermissionFlag флаги могут получить доступ к защищенным и частные члены объектов.

Осторожно

Потому что ReflectionPermission может обеспечить доступ к закрытым типам и члены, мы рекомендуем вам сделать не предоставлять ReflectionPermission для Интернет-код, кроме как с ReflectionPermissionFlag.RestrictedMemberAccess флаг. RestrictedMemberAccess позволяет доступ к закрытым членам, с ограничение, что набор грантов из непубличные участники должны быть равны, или подмножество, набор грантов код, который получает доступ к закрытым члены.

Другими словами, люди могут получить доступ к вашим внутренним объектам класса, только если вы позволите им - точно так же, как и с настройкой модификаторов доступа в первую очередь для прямых клиентов со ссылкой на сборку. Любой участник виден, только если вы позволите ему быть видимым.

2 голосов
/ 15 ноября 2010

Частные конструкторы часто используются с шаблонами проектирования (например, Шаблон метода фабрики , Шаблон Singleton ) для предотвращения неправильного создания объектов.

Закрытые статические методы часто быстрее вызывать, если вам не нужен доступ к каким-либо переменным экземпляра (компилятору не нужно проверять, что объект не равен нулю, между прочим).

0 голосов
/ 09 марта 2012

Это поведение отличается во время выполнения Silverlight, где в основном отражение может делать только то, что разрешено компилятору (C # или VB).Поэтому в Silverlight нельзя создавать экземпляры с помощью закрытого конструктора, даже с Activator.CreateInstance.

...