/* Это свойство обеспечивает доступ к закрытой переменной экземпляра prop. Оно разрешает получать значение переменной prop из любого кода, но устанавливать его — только членам своего класса. */
public int MyProp {
get {
return prop;
}
private set { // теперь это закрытый аксессор
prop = value;
}
}
// Этот член класса инкрементирует значение свойства MyProp.
public void IncrProp() {
MyProp++; // Допускается в том же самом классе.
}
}
// Продемонстрировать применение модификатора
//доступа в аксессоре свойства,
class PropAccessDemo {
static void Main() {
PropAccess ob = new PropAccess() ;
Console.WriteLine("Первоначальное значение ob.MyProp: " + ob.MyProp);
// ob.MyProp = 100;
// недоступно для установки
ob.IncrProp();
Console.WriteLine("Значение ob.MyProp после инкрементирования: " + ob.MyProp);
}
}
В классе PropAccess
аксессор set
указан как private
. Это означает, что он доступен только другим членам данного класса, например методу IncrProp(),
но недоступен для кода за пределами класса PropAccess
. Именно поэтому попытка Присвоить свойству ob.MyProp
значение в классе PropAccessDemo
закомментирована.
Вероятно, ограничение доступа к аксессорам оказывается наиболее важным для работы с автоматически реализуемыми свойствами. Как пояснялось выше, создать автоматически реализуемое свойство только для чтения или же только для записи нельзя, поскольку оба аксессора, get
и set
, должны быть указаны при объявлении такого свойства. Тем не менее добиться желаемого результата все же можно, объявив один из аксессоров автоматически реализуемого свойства как private
. В качестве примера ниже приведено объявление автоматически реализуемого свойства Length
для класса FailSoftArray
, которое фактически становится доступным только для чтения.
public int Length { get; private set; }
Свойство Length
может быть установлено только из кода в его классе, поскольку его аксессор set
объявлен как private
. А изменять свойство Length
за пределами его класса не разрешается. Это означает, что за пределами своего класса свойство, по существу, оказывается доступным только для чтения. Аналогичным образом можно объявить и свойство Error
, как показано ниже.
public bool Error { get; private set; }
Благодаря этому свойство Error
становится доступным для чтения, но не для установки за пределами класса FailSoftArray
.
Для опробования автоматически реализуемых вариантов свойств Length
и Error
в классе FailSoftArray
удалим сначала переменные len
и ErrFlag
, поскольку они больше не нужны, а затем заменим каждое применение переменных len
и ErrFlag
свойствами Length
и Error
в классе FailSoftArray
. Ниже приведен обновленный вариант класса FailSoftArray
вместе с методом Main(),
демонстрирующим его применение.
// Применить автоматически реализуемые и доступные
// только для чтения свойства Length и Error.
using System;
class FailSoftArray {
int[] a; // ссылка на базовый массив
// Построить массив по заданному размеру,
public FailSoftArray(int size) {
a = new int [size];
Length = size;
}
// Автоматически реализуемое и доступное
//только для чтения свойство Length,
public int Length { get; private set; }
// Автоматически реализуемое и доступное
//только для чтения свойство Error,
public bool Error { get; private set; }
// Это индексатор для массива FailSoftArray.
public int this[int index] {
// Это аксессор get.
get {
if(ok(index)) {
Error = false;
return a[index];
}