Разработка индексированных свойств
Обновлен: Ноябрь 2007
Индексированные свойства позволяют осуществить доступ к группам элементов подобно доступу к массиву (например, к символам в строке или битам в BitArray). Индексированные свойства, называемые индексаторами или свойствами по умолчанию, отличаются от обычных свойств тем, что они принимают параметры, указывающие, к какому элементу в группе следует осуществить доступ. Реализация индексированного свойства должна быть как можно более простой, так как индексаторы часто используются в циклах. Следующие рекомендации помогут правильно разработать индексаторы, содержащиеся в типах.
Рекомендуется использовать индексаторы для предоставления доступа к данным, хранящимся во внутреннем массиве.
Рекомендуется обеспечить индексаторы для типов, представляющих коллекции элементов.
Избегайте использования индексированных свойств с более чем одним параметром.
Если индексатор требует нескольких параметров, проверьте, действительно ли свойство обеспечивает доступ к логической коллекции. В противном случае используйте методы; выберите имя метода, начинающееся с Get или Set.
Избегайте использования индексаторов с параметрами типов, отличных от System.Int32, System.Int64, System.String, System.Object, перечислений или параметров базового типа.
Если при проектировании требуются параметры других типов, проверьте, действительно ли член обеспечивает доступ к логической коллекции. В противном случае используйте методы; выберите имя метода, начинающееся с Get или Set.
Используйте имя Item для индексированных свойств, если только нет явно лучшего имени (например, см. свойство System.String.Chars(System.Int32)).
Атрибут IndexerNameAttribute можно использовать при создании имени индексатора.
Не следует одновременно предоставлять и индексатор, и семантически эквивалентный метод.
В следующем примере кода индексатор следует заменить на метод.
<System.Runtime.CompilerServices.IndexerNameAttribute("PositionsHeld")> _
Public Property Item (skillId as Integer) as JobInfoCollection
...
Public Function GetPositions(skillId as Integer, _
minJobLevel as Integer) _
as JobInfoCollection
[System.Runtime.CompilerServices.IndexerNameAttribute("PositionsHeld")]
public JobInfoCollection this [int skillId]
...
public JobInfoCollection GetPositions(int skillId, int minJobLevel)
Не предоставляйте более одного семейства перегруженных индексаторов в одном типе.
Для некоторых компиляторов, таких как C#, это правило обязательно.
Некоторые языки не поддерживают несколько наборов индексаторов для типа. Если Вы их используете, некоторые разработчики не смогут получить доступ к этим членам.
Не следует использовать нестандартные индексированные свойства.
Для некоторых компиляторов, таких как C#, это правило обязательно. Нестандартные индексированные свойства не поддерживаются ни одним языком программирования. Если Вы их используете, некоторые разработчики не смогут получить доступ к этим членам.
Охраняется авторским правом Copyright 2005 Microsoft Corporation. Все права защищены.
Охраняется авторским правом Copyright Addison-Wesley Corporation. Все права защищены.
Дополнительные сведения о руководствах по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.