Condividi tramite


CA1023: Gli indicizzatori non devono essere multidimensionali

TypeName

IndexersShouldNotBeMultidimensional

CheckId

CA1023

Category

Microsoft.Design

Breaking Change

Breaking

Causa

Un tipo pubblico o protetto contiene un indicizzatore pubblico o protetto che utilizza più di un indice.

Descrizione della regola

Gli indicizzatori, ossia proprietà indicizzate, devono utilizzare un unico indice. Gli indicizzatori multidimensionali possono ridurre sensibilmente l'utilizzabilità della libreria. Se la progettazione richiede più indici, valutare se il tipo rappresenta un archivio dati logico. In caso contrario, utilizzare un metodo.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare la progettazione per utilizzare un solo Integer o indice di stringa oppure utilizzare un metodo anziché l'indicizzatore.

Esclusione di avvisi

Escludere un avviso da questa regola solo dopo aver considerato attentamente la necessità di un indicizzatore non standard.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo, DayOfWeek03, con un indicizzatore multidimensionale che viola la regola. L'indicizzatore può essere considerato come un tipo di conversione e pertanto è esposto come un metodo in modo più appropriato. Il tipo è riprogettato in RedesignedDayOfWeek03 per soddisfare la regola.

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

Regole correlate

CA0143: Utilizzare argomento di tipo stringa o integrale per gli indicizzatori

CA1024: Utilizzare proprietà dove appropriato