CA1023: Indexers should not be multidimensional
The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.
The latest version of this topic can be found at CA1023: Indexers should not be multidimensional.
TypeName|IndexersShouldNotBeMultidimensional|
|CheckId|CA1023|
|Category|Microsoft.Design|
|Breaking Change|Breaking|
A public or protected type contains a public or protected indexer that uses more than one index.
Indexers, that is, indexed properties, should use a single index. Multi-dimensional indexers can significantly reduce the usability of the library. If the design requires multiple indexes, reconsider whether the type represents a logical data store. If not, use a method.
To fix a violation of this rule, change the design to use a lone integer or string index, or use a method instead of the indexer.
Suppress a warning from this rule only after carefully considering the need for the nonstandard indexer.
The following example shows a type, DayOfWeek03, with a multi-dimensional indexer that violates the rule. The indexer can be seen as a type of conversion and therefore is more appropriately exposed as a method. The type is redesigned in RedesignedDayOfWeek03 to satisfy the rule.
using namespace System; namespace DesignLibrary { public ref class DayOfWeek03 { array<String^, 2>^ dayOfWeek; public: property String^ default[int, int] { String^ get(int month, int day) { return dayOfWeek[month - 1, day - 1]; } } DayOfWeek03() { dayOfWeek = gcnew array<String^, 2>(12, 7); dayOfWeek[0,0] = "Wed"; dayOfWeek[0,1] = "Thu"; // ... dayOfWeek[1,0] = "Sat"; dayOfWeek[1,1] = "Sun"; // ... } }; public ref class RedesignedDayOfWeek03 { static array<String^>^ dayOfWeek = {"Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"}; static array<int>^ daysInPreviousMonth = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30}; public: String^ GetDayOfWeek(int month, int day) { return dayOfWeek[(daysInPreviousMonth[month - 1] + day) % 7]; } }; }