Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DiVM / OSISP / ОCиСП-Часть3 / Теория / Теория (ОСиСП).doc
Скачиваний:
29
Добавлен:
11.05.2015
Размер:
616.96 Кб
Скачать

Массивы

Объявление массивов:

int[ ] intArr;

object[ ] objArr;

Массивы на уровне .Net представляются в виде объектов, которые наследуются от класса SystemArray. Это ссылочный класс, который является универсальным и предназначен для представления массивов разных видов, которые могут начинаться не с нуля. В этом классе много свойств и методов:

BinarySearch; // двоичный поиск делением объекта пополам

Sort // сортировка

Rank // размерность (сколько измерений)

LowerBound // минимальное значение индекса для соответствующего

// измерения

MaxBound // макс значение индекса

В C# массивы отсчитываются всегда от 0 ( поэтому LowerBound ==0)

Виды массивов:

  1. Одномерные

  1. Многомерные

  1. Ступенчатые – одномерный массив, который содержит ссылки на другие массивы.

Объявления:

  1. Одномерный int[ ] intArr;

  2. Двумерный int[ , ] dim2Arr = new int [3,6]

  3. Ступенчатый int [ ][ ] jaggedArr = new int[6]

{

new int[4], new int[2],

new int[6], null, null, null;

}

Метод Get в SystemArray

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

При выполнении бинарного поиска и сортировки (эти функции внесены в саму платформу) внутри функций проверка на диапазон может быть отменена.

Есть оператор fixed, внутри него можно оперировать понятием адреса (указателя):

int[ ] arr;

fixed

{

int* p=&arr[0]; // это необязательный код, и если есть fixed-секция, то

*(p+2)=5; // этот модуль помечается как небезопасный

}

Этот небезопасный код используется очень редко.

Любой прикладной код бывает:

1) managed ( управляемый) и unmanaged

2) безопасный/небезопасный ( safe/unsafe)

Управляемый код – код на языке IL (программа представлена в промежуточном языке) и удовлетворяет требованиям.

Неуправляемый – берёт код в родных инструкциях процессора. Этот код небезопасный, может обращаться к ОС.

( из управляемого кода можно вызвать неуправляемый код и наоборот)

Безопасный код не оперирует понятием указателя (не использует адресную арифметику).

Небезопасный код использует адресную арифметику, может быть управляемым.

managed (IL) safe (p)

unmanaged (ASM) unsafe (*p)

C# позволяет писать managed программы safe и unsafe (т.е. 1 и 2).

С++/CLI: 1,2,3.

Delphi: 1,2,3.