Массивы, не основанные на нулях, существуют в C, и есть способ создать массив, основанный на 1 (или любом другом).
Я полностью согласен с тем, что они грязные, и их не следует использовать ни для чего, кроме устаревших вещей, но они необходимы для взаимодействия со старыми библиотеками COM.
Наиболее распространенное место, с которым можно столкнуться, это работа с объектом Microsoft.Office.Interop.Excel.Range в библиотеке Excel, который все еще использует старый интерфейс DCOM, расположенный внизу.
Пример:
/// <summary>
/// Makes the equivalent of a local Excel range that can be populated
/// without leaving .net
/// </summary>
/// <param name="iRows">number of rows in the table</param>
/// <param name="iCols">number of columns in the table</param>
/// <returns>a 1's based, 2 dimensional object array which can put back to Excel in one DCOM call.</returns>
public static object[,] NewObjectArray(int iRows, int iCols)
{
int[] aiLowerBounds = new int[] { 1, 1 };
int[] aiLengths = new int[] { iRows, iCols};
return (object[,])Array.CreateInstance(typeof(object), aiLengths, aiLowerBounds);
}
В этом случае причина, по которой этот код необходим, заключается в том, что каждый вызов DCOM для Excel является межпроцессным, и если бы вы обращались к ячейкам по одному, вы бы понеслиогромные накладные расходы (либо получение, либо установка значений).Диапазон Excel - это двумерный массив на основе единицы, и если он создает массив и заполняет его локально, его можно заставить превзойти в одном межпроцессном вызове, что значительно повысит производительность.