Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Хотя свойства технически похожи на методы, они совершенно отличаются с точки зрения их сценариев использования. Они должны рассматриваться как умные поля. У них синтаксис вызова, как у полей, и гибкость методов.
Создавайте только доступные для чтения свойства, если вызывающий код не должен иметь возможность изменять значение свойства.
Помните, что если тип свойства является изменяемым ссылочным типом, значение свойства может быть изменено, даже если свойство доступно только для получения.
❌ НЕ предоставляйте свойства, доступные только для задания, или свойства, у которых метод задания имеет более широкий доступ, чем метод получения.
Например, не используйте свойства с общедоступным сеттером и защищённым геттером.
Если не удается предоставить метод получения свойства, реализуйте функциональные возможности в качестве метода. Рассмотрите возможность начать имя метода с Set
и продолжить тем, что вы назвали бы свойством. Например, у AppDomain есть метод под названием SetCachePath
вместо свойства CachePath
, доступного только для установки.
✔️ Do предоставляет разумные значения по умолчанию для всех свойств, гарантируя, что значения по умолчанию не приводят к дыре безопасности или ужасно неэффективному коду.
✔️ Разрешите установку свойств в любом порядке, даже если это приводит к временному недопустимому состоянию объекта.
Обычно два или более свойства могут быть связаны с точкой, в которой некоторые значения одного свойства могут быть недопустимыми, учитывая значения других свойств одного объекта. В таких случаях исключения, возникающие из-за недопустимого состояния, должны быть отложены до тех пор, пока взаимосвязанные свойства не были использованы объектом.
✔️ Не сохраняйте предыдущее значение, если метод задания свойств создает исключение.
❌ Избегайте возникновения исключений из методов получения свойств.
Методы получения свойств должны быть простыми операциями и не должны иметь предварительных условий. Если геттер может вызвать исключение, его, вероятно, следует переработать как метод. Обратите внимание, что это правило не применяется к индексаторам, где мы ожидаем исключения в результате проверки аргументов.
Проектирование индексированных свойств
Индексированные свойства — это специальное свойство, которое может иметь параметры и может вызываться с особым синтаксисом, аналогичным индексации массива.
Индексированные свойства обычно называют индексаторами. Индексаторы должны использоваться только в API, которые предоставляют доступ к элементам в логической коллекции. Например, строка представляет собой коллекцию символов, а индексатор System.String добавлен для доступа к его символам.
✔️ Рекомендуется использовать индексаторы для предоставления доступа к данным, хранящимся во внутреннем массиве.
✔️ Рассмотрите возможность предоставления индексаторов для типов, представляющих коллекции элементов.
❌ Избегайте использования индексированных свойств с несколькими параметрами.
Если дизайн требует нескольких параметров, пересмотрите, действительно ли свойство представляет собой аксессор к логической коллекции. Если это не так, используйте вместо этого методы. Рассмотрите возможность запуска имени метода с Get
или Set
.
❌Избегайте индексаторов с типами параметров, отличных от System.Int32, System.Int64, System.String, System.Object или перечисления.
Если дизайн требует использования других типов параметров, тщательно пересмотрите, действительно ли API представляет собой метод доступа к логической коллекции. Если это не так, используйте метод. Рассмотрите возможность запуска имени метода с Get
или Set
.
✔️ Используйте имя Item
для индексированных свойств, если нет очевидно лучшего названия (например, см. свойство Chars[] на System.String
).
В C#индексаторы по умолчанию называются Item. IndexerNameAttribute можно использовать для настройки этого имени.
❌ НЕ предоставляйте индексатор и методы, которые семантически эквивалентны.
❌ Не предоставляйте несколько семейств перегруженных индексаторов в одном типе.
Это применяется компилятором C#.
❌ НЕ используйте индексированные свойства не по умолчанию.
Это применяется компилятором C#.
События уведомления об изменении свойств
Иногда полезно предоставить событие, уведомляющее пользователя об изменениях в значении свойства. Например, System.Windows.Forms.Control
вызывает TextChanged
событие после изменения значения его Text
свойства.
✔️ Рекомендуется вызывать события уведомлений об изменении при изменении значений свойств в высокоуровневых API (обычно компонентах конструктора).
Если у пользователя есть хороший сценарий, чтобы узнать, когда изменяется свойство объекта, объект должен вызвать событие уведомления об изменении свойства.
Однако вряд ли стоит инициировать такие события для низкоуровневых API, таких как базовые типы или коллекции, учитывая накладные расходы. Например, List<T> не вызовет таких событий при добавлении нового элемента в список и изменении свойства Count
.
✔️ Рекомендуется вызывать события уведомления об изменениях, когда значение свойства изменяется через внешние силы.
Если значение свойства изменяется под влиянием внешних факторов (не через вызов методов объекта), генерируются события, которые указывают разработчику, что значение находится в процессе изменения и уже изменилось. Хорошим примером Text
является свойство элемента управления текстовым полем. Когда пользователь вводит текст в TextBox
, значение свойства автоматически изменяется.
© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.
Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.