Класс System::Array (Система::Массив)
В обычном C++ такая ошибка часто не проявляется до тех пор, пока программа, по непонятным причинам, не прекращает работу, обычно в месте кода, далеко отстоящем от самой ошибки. И, разумеется, согласно закону Мэрфи, эта ошибка обнаруживается только тогда, когда программа уже передана заказчику.
//IndexOutOfRangeException.срр #using <mscorlib.dll> using namespace System; // использовать пространство имен Система/void main () { int intArray _gc[]= new int _gc[5]; // сборщик мусора [5] for (int i=0; i<6; i++) // больше чем есть!!! { try { intArray[i] = i; } catch (IndexOutOfRangeException *piore) { // нужно сделать кое-что более полезное, // чтобы здесь восстановиться Console::WriteLine("Oooops!"); Console::WriteLine(piore › get_Message()); } } }
Программа напечатает:
Oooops! Exception of type System.IndexOutOfRangeException was thrown.
Перевод такой [Добавлен редактором русского перевода. – Прим. ред.]:
Возникло исключение типа Система.IndexOutOfRangeException.
Как и для неуправляемых массивов, нумерация элементов в управляемых массивах начинается с нуля. Однако, значения элементов управляемых массивов, в отличие от элементов неуправляемых массивов, автоматически инициализируются значением, принятым по умолчанию для каждого типа элемента массива. Переменным примитивных типов, таких, как int, char (символ), float (с плавающей точкой) и double (с удвоенной точностью) присваивается нуль. Элементам, указывающим на управляемые объекты, также по умолчанию присваивается нулевое значение (т.е. нулевой указатель). Элементы значимых типов инициализируются с помощью их принятого по умолчанию конструктора (т.е. конструктора, не имеющего аргументов). Значимые типы подробнее рассмотрены ниже.
В следующем примере иллюстрируется работа с массивами, и сравниваются управляемый двумерный массив и обычный неуправляемый двумерный же массив. Обратите внимание, что при работе с неуправляемым массивом используется старый синтаксис доступа к элементам массива [ ] [ ], тогда как при работе с управляемым массивом, который является истинно двумерным, используется синтаксис [, ]. Хотя в этом примере при использовании синтаксиса [ ] [ ] каждый из подмассивов имеет одинаковое количество элементов, в других случаях они могут иметь разные размеры (т.н. массив с неровным правым краем). Синтаксис [, ] предполагает использование истинно прямоугольного массива.
//Arrayl.срр fusing <mscorlib.dll> using namespace System; // использовать пространство имен Система; void main () { // управляемый одномерный массив int // (использующий сборщик мусора) Console::WriteLine("managed ID array of int"); // ("управляемый одномерный массив int"); int intArray _gc[]= new int _gc[5]; for (int i=0; i<intArray › Length; i++) { intArray[i] = i; Console::Write(intArray[i]); // Запись Console::Write("\t"); // Запись } Console::WriteLine(); // управляемый двумерный массив Строк // (использующий управляемый тип) Console::WriteLine("managed 2D array of Strings"); // ("управляемый двумерный массив Строк "); String *str2DArray[,] = new String *[2.3]; // новая Строка for(int row=0; row<str2DArray › GetLength(0); row++) //по строкам { for(int col=0; col<str2DArray › GetLength(l); col++) //по столбцам { str2DArray[row,col] = (row*10 + col).ToString(); // str2DArray [строка, столбец] = (row*10 + столбец) //.ToString (); Console::Write(str2DArray[row,col]); // Запись:: (str2DArray [строка, столбец]); Console::Write("\t"); // Запись } Console::WriteLine(); } // неуправляемый двумерный массив int (для сравнения) Console::WriteLine("unmanaged 2D array of int"); // ("неуправляемый двумерный массив int"); int int2DArray[2][3]; for(int row=0; row<2; row++) //по строкам { for (int col=0; col<3; col++) // по столбцам { int2DArray[row][col] = row*10 + col; // int2DArray [строка] [столбец] = row*10 + столбец; Console::Write(int2DArray[row][col]); // Запись:: (int2DArray [строка] [столбец]); Console::Write("\t"); // Запись } Console::WriteLine(); })