Елементи масиву мають одне і те ж ім'я, а розрізняються порядковим номером (індексом). Це дозволяє компактно записувати множину операцій за допомогою циклів.
Масив відноситься до посилальних типів даних, тобто розташовується в динамічній області пам'яті, тому створення масиву починається з виділення пам'яті під його елементи. Елементами масиву можуть бути величини як значущих, так і посилальних типів (зокрема масиви). Масив значущих типів зберігає значення, масив посилальних типів - посилання на елементи. Всім елементам при створенні масиву привласнюються значення за умовчанням: нулі для значущих типів і null - для посилальних.
На рис. 6.1 представлений масив, що складається з п'яти елементів будь-якого значущого типу, наприклад int або double, а рис. 6.2 ілюструє організацію масиву з елементів посилального типу.
Ось, наприклад, як виглядають оператори створення масиву з 10 цілих чисел і масиву з 100 рядків:
int[] w = new int [10];
string[] z = new string [100];
Рис. 6.1. Прості змінні і масив з елементів значущого типу
Рис. 6.2. Масив з елементів посилального типу
У першому операторі описаний масив w типу int[]. Операція new виділяє пам'ять під 10 цілих елементів, і вони заповнюються нулями.
У другому операторі описаний масив z типу string[]. Операція new виділяє пам'ять під 100 посилань на рядки, і ці посилання заповнюються значенням null. Кількість елементів в масиві (розмірність) не є частиною його типу, ця кількість задається при виділенні пам'яті і не може бути змінена згодом. Розмірність може задаватися не тільки константою, але і виразом. Результат обчислення цього виразу має бути додатним, а його тип повинен мати неявне перетворення до int, uint, long або ulong.
Приклад розмірності масиву, заданої виразом:
short n = 10;
string[] z = new string[n + 1];
Елементи масиву нумеруються з нуля, тому максимальний номер елементу завжди на одиницю менше розмірності (наприклад, в описаному вище масиві w елементи мають індекси від 0 до 9). Для звернення до елементу масиву після імені масиву указується номер елементу в квадратних дужках, наприклад:
w[4] z[i]
З елементом масиву можна робити все, що допустимо для змінних того ж типу. При роботі з масивом автоматично виконується контроль виходу за його межі: якщо значення індексу виходить за межі масиву, генерується виключення IndexOutOfRangeException.
Масиви одного типу можна привласнювати один одному. При цьому відбувається привласнення посилань, а не елементів, як і для будь-якого іншого об'єкту посилального типу, наприклад:
int[] а = new int[10];
int[] b = а; // b і а указують на один і той же масив
Всі масиви в С# мають загальний базовий клас Array, визначений в просторі імен System. У нім є декілька корисних методів, що спрощують роботу з масивами
У С# існують три різновиди масивів: одновимірні, прямокутні і ступінчасті.