Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

5.13.2Многомерные индексаторы

Можно также создавать индексатор, принимающий несколько параметров:

namespace ConsoleApplication1

{

class MyArr

{

int[,] arr;

// Размерность двухмерного массива

public int rows, cols, Length;

public MyArr(int rows, int cols)

{

this.rows = rows;

this.cols = cols;

arr = new int[this.rows, this.cols];

Length = rows * cols;

}

// Индексатор

public int this[int index1, int index2]

{

get { return arr[index1, index2]; }

set { arr[index1, index2] = value; }

}

}

class Program

{

static void Main(string[] args)

{

Random ran = new Random();

Console.WriteLine("Arr1: \n");

MyArr arr1 = new MyArr(4, 5);

for (int i = 0; i < arr1.rows - 1; i++)

{

for (int j = 0; j < arr1.cols - 1; j++)

{

arr1[i, j] = ran.Next(1, 20);

Console.Write(arr1[i, j] + "\t");

}

Console.WriteLine();

}

Console.ReadLine();

}

}

}

5.14Свойства

Еще одной разновидностью члена класса является свойство. Как правило, свойство сочетает в себе поле с методами доступа к нему.

Свойства очень похожи на индексаторы. В частности, свойство состоит из имени и аксессоров get и set. Аксессоры служат для получения и установки значения переменной. Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set. Аналогичным образом используются аксессоры get и set индексатора.

Общая форма свойства:

тип имя {

get

{

// код аксессора для чтения из поля

}

set

{

// код аксессора для записи в поле

}

}

где тип обозначает конкретный тип свойства, например int, а имя — присваиваемое свойству имя. Как только свойство будет определено, любое обращение к свойству по имени приведет к автоматическому вызову соответствующего аксессора. Кроме того, аксессор set принимает неявный параметр value, который содержит значение, присваиваемое свойству.

Следует, однако, иметь в виду, что свойства не определяют место в памяти для хранения полей, а лишь управляют доступом к полям. Это означает, что само свойство не предоставляет поле, и поэтому поле должно быть определено независимо от свойства.

namespace ConsoleApplication1

{

class UserInfo

{

int a;

string s = "Alex";

// Создадим свойство, управляющее доступом к переменной a

public int Age

{

get

{

if (a <= 0) return 1;

return a;

}

set { a = value; }

}

// Свойство только для чтения переменной s; аксессор set отсутствует

public string Name

{

get { return s; }

}

}

class Program

{

static void Main(string[] args)

{

UserInfo ui = new UserInfo();

// Доступ к закрытой переменной экземпляра только через свойство

ui.Age = 26;

// Переменная только для чтения

string myName = ui.Name;

Console.ReadLine();

}

}

}

Свойствам присущ ряд существенных ограничений:

  • Cвойство не определяет место для хранения данных и поэтому не может быть передано методу в качестве параметра ref или out.

  • Cвойство не подлежит перегрузке. Наличие двух разных свойств с доступом к одной и той же переменной допускается, но это, скорее, исключение, чем правило.

  • Cвойство не должно изменять состояние базовой переменной при вызове аксессора get. И хотя это ограничительное правило не соблюдается компилятором, его нарушение считается семантической ошибкой. Действие аксессора get не должно носить характер вмешательства в функционирование переменной.