索引属性设计

索引属性允许像访问数组一样对一组项(例如字符串中的字符,或 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)
[System::Runtime::CompilerServices::IndexerNameAttribute("PositionsHeld")]
property JobInfoCollection^ default [int]


...


JobInfoCollection^ GetPositions(int skillId, int minJobLevel)

不要在一个类型中提供一组以上的重载索引器。

一些编译器(如 C# 编译器)会强制实施此准则。

有些语言不支持多组索引器。 如果使用了多组索引器,有些开发人员将无法访问这些成员。

不要使用非默认索引属性。

一些编译器(如 C# 编译器)会强制实施此准则。 并不是所有编程语言都支持非默认索引属性。 如果使用了非默认索引属性,有些开发人员将无法访问这些成员。

部分版权所有 2005 Microsoft Corporation。 保留所有权利。

部分版权所有 Addison-Wesley Corporation。 保留所有权利。

设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。

请参见

概念

属性设计

其他资源

成员设计准则

类库开发的设计准则