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];
        }
    }
}

CA1043: Use integral or string argument for indexers

CA1024: Use properties where appropriate