Индексы не должны быть многомерными
Обновлен: Ноябрь 2007
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];
}
};
}