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


CA1814: используйте ступенчатые массивы вместо многомерных

Свойство Значение
Идентификатор правила CA1814
Заголовок Используйте массивы массивов вместо многомерных массивов
Категория Производительность
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 No

Причина

Элемент объявляется как многомерный массив, что может привести к напрасному расходу пространства для некоторых наборов данных.

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

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

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

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

Когда лучше отключить предупреждения

Можно отключить предупреждение из этого правила, если в многомерном массиве не тратится место.

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

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA1814
// The code that's violating the rule is on this line.
#pragma warning restore CA1814

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

[*.{cs,vb}]
dotnet_diagnostic.CA1814.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

В следующем примере показаны объявления массива массивов и многомерного массива.

Imports System

Public Class ArrayHolder
    Private jaggedArray As Integer()() =  {New Integer() {1, 2, 3, 4}, _
                                           New Integer() {5, 6, 7}, _
                                           New Integer() {8}, _
                                           New Integer() {9}}
    
    Private multiDimArray As Integer(,) =  {{1, 2, 3, 4}, _
                                            {5, 6, 7, 0}, _
                                            {8, 0, 0, 0}, _
                                            {9, 0, 0, 0}}
End Class
public class ArrayHolder
{
    int[][] jaggedArray = { new int[] {1,2,3,4},
                            new int[] {5,6,7},
                            new int[] {8},
                            new int[] {9}
                          };

    int[,] multiDimArray = {{1,2,3,4},
                             {5,6,7,0},
                             {8,0,0,0},
                             {9,0,0,0}
                            };
}