Поделиться через


CA1023: индексы не должны быть многомерными

TypeName

IndexersShouldNotBeMultidimensional

CheckId

CA1023

Категория

Microsoft.Design

Критическое изменение

Критическое изменение

Причина

Открытый или защищенный тип содержит открытый или защищенный индексатор, использующий несколько индексов.

Описание правила

Индексаторы, то есть индексированные свойства, должны использовать один индекс. Многомерные индексаторы могут крайне отрицательно сказаться на удобстве работы с библиотекой. Если в программе требуется использовать несколько индексом, проверьте еще раз, представляет ли тип логическое хранилище данных. Если не представляет, используйте метод.

Устранение нарушений

Чтобы устранить нарушение данного правила, измените структуру программы таким образом, чтобы использовать единственный целочисленный или строковый индекс, или используйте вместо индексатора метод.

Отключение предупреждений

Предупреждения о нарушении этого правила следует отключать только после тщательной проверки необходимости использовать нестандартный индексатор.

Пример

В следующем примере показан тип DayOfWeek03 с многомерным индексатором, который нарушает данное правило. Можно увидеть, что данный индексатор представляет собой некоторый тип преобразования, и поэтому его более правильно использовать в качестве метода. Чтобы устранить нарушение правила, данный тип был переработан в RedesignedDayOfWeek03.

Imports System

Namespace DesignLibrary

    Public Class DayOfWeek03

        Private dayOfWeek(,) As String = {{"Wed", "Thu", "..."}, _
                                          {"Sat", "Sun", "..."}}
                                          ' ...

        Default ReadOnly Property Item(month As Integer, day As Integer) As String
            Get
                Return dayOfWeek(month - 1, day - 1)
            End Get
        End Property

    End Class

    Public Class RedesignedDayOfWeek03

        Private dayOfWeek() As String = _
            {"Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"}
        Private daysInPreviousMonth() As Integer = _
            {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30}

        Function GetDayOfWeek(month As Integer, day As Integer) As String
            Return dayOfWeek((daysInPreviousMonth(month - 1) + day) Mod 7)
        End Function

    End Class

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

Связанные правила

CA1043: используйте целый или строковый аргумент для индексаторов

CA1024: используйте свойства, если это уместно