Bool ErrFlag; // теперь это частная переменная,



Обозначающая результат последней операции

 

// Построить массив заданного размера,  

public FailSoftArray(int size) {  

a = new int[size];  

len = size;

}

 

// Свойство Length только для чтения,  

public int Length {  

get {

return len;

}

}

 

// Свойство Error только для чтения,  

public bool Error {  

get {

return ErrFlag;

}

}

 

// Это индексатор для класса FailSoftArray.  

public int this[int index] {

// Это аксессор get.  

get {

if(ok(index)) {

ErrFlag = false;  

return a[index];

}  

else {

ErrFlag = true;  

return 0;

}

}

// Это аксессор set.  

set {

if(ok(index)) {

a[index] = value;

ErrFlag = false;

}

else  

ErrFlag = 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);

}

}

}

 

Создание свойства Error стало причиной двух следующих изменений в классе FailSoftArray. Во-первых, переменная ErrFlag была сделана закрытой, поскольку теперь она служит базовым местом хранения данных для свойства Error, а следовательно, она не должна быть доступна непосредственно. И во-вторых, было введено свойство Error "только для чтения". Теперь свойство Error будет опрашиваться в тех программах, где требуется организовать обнаружение ошибок. Именно это и было продемонстрировано выше в методе Main(), где намеренно сгенерирована ошибка нарушения границ массива, а для ее обнаружения использовано свойство Error.

 

 

Автоматически реализуемые свойства

 

Начиная с версии C# 3.0, появилась возможность для реализации очень простых свойств, не прибегая к явному определению переменной, которой управляет свойство. Вместо этого базовую переменную для свойства автоматически предоставляет компилятор. Такое свойство называется автоматически реализуемым и принимает следующую общую форму:

 

тип имя { get; set; }

 

где тип обозначает конкретный тип свойства, а имя — присваиваемое свойству имя. Обратите внимание на то, что после обозначений аксессоров get и set сразу же следует точка с запятой, а тело у них отсутствует. Такой синтаксис предписывает компилятору создать автоматически переменную, иногда еще называемую поддерживающим полем, для хранения значения. Такая переменная недоступна непосредственно и не имеет имени. Но в то же время она может быть доступна через свойство.

Ниже приведен пример объявления свойства, автоматически реализуемого под именем UserCount.

 

public int UserCount { get; set; }

 

Как видите, в этой строке кода переменная явно не объявляется. И как пояснялось выше, компилятор автоматически создает анонимное поле, в котором хранится значение. А в остальном автоматически реализуемое свойство UserCount подобно всем остальным свойствам.

Но в отличие от обычных свойств автоматически реализуемое свойство не может быть доступным только для чтения или только для записи. При объявлении этого свойства в любом случае необходимо указывать оба аксессора — get и set. Хотя добиться желаемого (т.е. сделать автоматически реализуемое свойство доступным только для чтения или только для записи) все же можно, объявив ненужный аксессор как private (подробнее об этом — в разделе "Применение модификаторов доступа в аксессорах").

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

 

 


Дата добавления: 2019-02-12; просмотров: 306; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!