CA1023: Indexers should not be multidimensional
Item | Value |
---|---|
RuleId | CA1023 |
Category | Microsoft.Design |
Breaking change | Breaking |
Cause
A public or protected type contains a public or protected indexer that uses more than one index.
Rule description
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.
How to fix violations
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.
When to suppress warnings
Suppress a warning from this rule only after carefully considering the need for the nonstandard indexer.
Example
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 System;
namespace DesignLibrary
{
public class DayOfWeek03
{
string[,] dayOfWeek = {{"Wed", "Thu", "..."},
{"Sat", "Sun", "..."}};
// ...
public string this[int month, int day]
{
get
{
return dayOfWeek[month - 1, day - 1];
}
}
}
public class RedesignedDayOfWeek03
{
string[] dayOfWeek =
{"Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"};
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];
}
}
}