Не выровненные массивы
Массивы
В С# массивы являются объектами, производными от базового класса
System.Array
Поскольку массивы – это объекты класса, то их создание производится точно так же, как и объектов ссылочного типа.
Одномерные массивы в С# объявляются следующим образом:
int[] mas;
mas = new int[10];
или, что - то же самое:
int[] mas = new int[10];
В квадратных скобках указывается размерность массива. Нумерация индексов массива, как и в «С» от 0 до 9.
При объявлении многомерного массива в С# в квадратных скобках через запятую перечисляют размерность каждого измерения массива:
float [, ,] ms = new float[3,2,2];
При объявлении массивы можно инициализировать следующим образом:
int[] ch = new int[]{25,30,40,75};
При инициализации можно опустить оператор new. Следующая запись эквивалентна предыдущей записи:
int[] ch = {25,30,40,75};
Инициализация многомерного массива:
int ms[,] = {{5,7,25},{7,4,25,75}};
Инициализаторы элементов массива перечисляются через запятую в виде списка, заключенного в фигурные скобки. Размерность массива определяется транслятором автоматически по списку инициализаторов.
Обращение к элементам массива осуществляется по имени массива с указанием индекса (номера) элемента массива:
ms[j,k] = 35;
ms[1,2] = ch[3];
В С# осуществляется строгий контроль обращения к элементам массива. Попытка чтения и записи за пределы массива вызывают ошибку выполнения программы.
Так как массив является объектом класса System.Array то при создании экземпляра массива наследуются член функции этого класса, которые мы можем использовать.
Например, свойство Length – возвращает число всех экземпляров массива:
int[,] mas = new int[5,6];
int sz = mas.Lenght; //sz=30;
Число измерений массива, которое называется рангом, можно получить с помощью свойства Array.Rank.
Например, для нашего случая:
int rk = mas.Rank; //rk = 2;
Не выровненный массив – это внешний массив, состоящий из внутренних массивов разной длины. Это означает, что такой массив можно использовать, например, для создания таблицы, содержащей строки разной длины.
Синтаксис объявления:
type[][] имя = new type[size][];
size – это количество внутренних массивов.
Например, объявление не выровненного массива, состоящего из трех внутренних массивов длиной в 30, 10 и 3 элемента соответственно выглядит следующим образом:
int[][] table = new int[3][]; //Объявление не выровнененого
//массива
table[0] = new int[30]; //Внутренние
table[1] = new int[10]; // массивы и
table[2] = new int[3]; // задание их размерностей
Если не выровненный массив объявляется не как локальный объект, какой либо функции, а как поле класса, то определение размерности внутренних массивов и выделение для них памяти должно происходить в конструкторе класса – иначе ошибка компиляции.
Например:
class Mn
{
int [][] mas = new int[3][]; //Поле класса - массив
public Mn() //Конструктор класса
{
mas[0]= new int[40]; //Задание размерностей
mas[1]= new int[23]; //внутренних массивов
mas[2]= new int[15];
}
public void func()
{
double [][] db = new double[3][]; //Здесь массив локальный
db[0] = new double[3]; // объект
db[1] = new double[7];
db[2] = new double[32];
}
:
:
}
Вопросы:
1. Как осуществляется вызов конструкторов данного класса из других конструкторов?
2. Допустимо ли объявлять конструкторы со спецификациями protected и private?
3. Что такое свойство?
4. Сколько свойств может быть объявлено в классе?
5. Может ли свойство использоваться для работы сразу с несколькими полями?
6. Как организовать поле только для чтения?
7. Как организовать поле только для записи?
8. Почему свойства называют интеллектуальными полями?
9. Как объявляются одномерные и многомерные массивы?
10. Каким образом инициализируются массивы при их объявлении?
11. Как объявляются не выровненные массивы?
Индексаторы
Индексаторы позволяют программе обращаться с объектами так, как будто они являются массивами.
Индексаторы называют иногда умными массивами.
Индексатор во многом напоминает свойство, но он в отличие от свойства оперирует с полем, являющимся массивом, и в качестве имени индексатора используется ключевое слово this (это) с заключенными в квадратные скобки индексом.
Определение индексатора синтаксически выглядит следующим образом:
public float this[int j]
{
get
{
: //Возврат необходимых данных
}
set
{
: //Установка необходимых данных
}
}
Пример:
using System;
namespace ConsoleApplication10
{
class MyClass
{
protected float[,] msf = new float[2,4];
public float this[int k,int j] // индексатор для двумерного массива
{
get{ return (msf[k,j]);}
set{ msf[k,j] = value;}
}
protected int [] mas = new int[10];
public int this[int j] // индексатор для одномерного массива
{
get{ return (mas[j]);}
set{ mas[j] = value;}
}
}
class Class1
{
static void Main(string[] args)
{
MyClass abc = new MyClass();
abc[0,3] = 35.4F; //F означает float, а не doudle
abc[0] = 100;
Console.WriteLine(abc[0,3]);
Console.WriteLine(abc[0]);
}
}
}