В классе PropAccess аксессор set указан как private. Это означает, что он доступен только другим членам данного класса, например методу IncrProp(), но недоступен для кода за пределами класса PropAccess.
//применить модификатор доступа в асессоре
using System;
class PropAccess
{
int prop;//поле, управляемое свойством МуРrор
public PropAccess() { prop = 0; }
/* Это свойство обеспечивает доступ к закрытой переменной экземпляра prop.
Оно разрешает получать значение переменной prop из любого кода,
но устанавливать его — только членам своего класса. */
public int MyProp
{
get
{
return prop;
}
private set
{// теперь это закрытый аксессор
prop = value;
}
}
// Этот член класса инкрементирует значение свойства МуРrор.
public void IncrProp()
{
MyProp++; //Допускается в. том же самом классе.
}
}
// Продемонстрировать применение модификатора доступа в аксессоре свойства.
class PropAccessDemo
{
static void Main()
{
PropAccess ob = new PropAccess();
Console.WriteLine("Первоначальное значение ob.MyProp: " + ob.MyProp);
// ob.МуРrор = 100; // недоступно для установки
ob.IncrProp();
Console.WriteLine("Значение ob.MyProp после инкрементирования: " + ob.MyProp);
|
|
}
}
Вероятно, ограничение доступа к аксессорам оказывается наиболее важным для работы с автоматически реализуемыми свойствами. Как пояснялось выше, создать автоматически реализуемое свойство только для чтения или же только для записи нельзя, поскольку оба аксессора, get и set, должны быть указаны при объявлении такого свойства. Тем не менее добиться желаемого результата все же можно, объявив один из аксессоров автоматически реализуемого свойства как private. В качестве примера ниже приведено объявление автоматически реализуемого свойства Length для класса FailSoftArray, которое фактически становится доступным только для чтения.
public int Length { get; private set; }
Аналогичным образом можно объявить и свойство 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];
}
else
{
Error = true;
return 0;
}
}
// Это аксессор set.
set
{
if (ok(index))
{
a[index] = value;
Error = false;
}
else Error = true;
}
}
// Возвратить логическое значение true, если
// индекс находится в установленных границах.
private bool ok(int index)
{
if (index >= 0 & index < Length) return true;
return false;
}
}
// Продемонстрировать применение усовершенствованного
// отказоустойчивого массива.
class FinalFSDemo
{
static void Main()
{
FailSoftArray fs = new FailSoftArray(5);
// Использовать свойство Error.
for (int i = 0; i < fs.Length + 1; i++)
{
fs[i] = i * 10;
if (fs.Error)
Console.WriteLine("Ошибка в индексе " + i);
}
}
}
На применение модификаторов доступа в аксессорах накладываются следующие ограничения.
1. Во-первых, действию модификатора доступа подлежит только один аксессор: set или get, но не оба сразу.
2. Во-вторых, модификатор должен обеспечивать более ограниченный доступ к аксессору, чем доступ на уровне свойства или индексатора.
3. И наконец, модификатор доступа нельзя использовать при объявлении аксессора в интерфейсе или же при реализации аксессора, указываемого в интерфейсе. (Подробнее об интерфейсах речь пойдет в главе 12.)