воскресенье, 11 октября 2009 г.

Поля readonly в C# (Csharp)

Использование константы, как переменной, которая содержит значение, которое нельзя изменить - это то, что C# (Csharp) разделяет с другими языками программирования. Хотя константы не всегда соответствуют всем требованиям. Часто случается так, что переменную нужно получить в результате расчетов, а потом сделать ее "только для чтения". В C# (Csharp) именно для таких случаев предусмотрен тип переменных readonly.
Переменные поля readonly имеют большую гибкость, нежели const, потому что позволяют перед присваиванием производить различные вычисления значения, которое должно быть "только для чтения". Правило использования таких полей говорит, что вы можете присваивать им значение только в конструкторе, и нигде более. Одной из основных особенностей таких полей, является то, что они могут пренадлежать и экземплярам класса, а не быть статическими. Это позволяет получать различные значения полей только для чтения в разных экземплярах классов. Это значит, что в отличие от полейconst, если вы хотите сделать поле readonly статическим, то должны явно обьявить его таковым.
В качестве примера можно рассмотреть случай, когда в зависимости от купленной лицензии - меняется функциональная часть программы. При более дорогой лицензии - программа позволяет работать с большим количеством документов (если у нас MDI-приложение). Тогда в конструкторе мы определяем по какой лицензии работает пользователь, и в зависимости от ее типа, присваиваем обявленной переменной, с типом readonly, значение количества допустимых документов.
В описанном выше примере, примерный код будет выглядеть так:

public class MdiEditor
{
public static readonly uint MaxDocuments;
static MdiEditor()
{
MaxDocuments = CheckMaxNumDocs();
}
}
В данном конкретном примере, мы обьявляем нашу переменную как статическую, и используем ее в экземпляре класса при каждом запуске программы. Функция CheckMaxNumDocs какраз должна проверить тип лицензии по которой работает пользователь, и венрнуть количество максимально допустимых документов, с которыми может работать пользователь с данной лицензией.
Полями readonly могут быть обьявлены различные типы данных, в подтверждение этому покажу и такой код:

public class NextSample
{
public readonly DateTime CurrentDate;
public NextSample()
{
CurrentDate = new DateTime(2008, 2, 6);
}
}
В итоге получаем текущую дату CurrentDate, которую изменить дальше по коду - нельзя.
Поля readonly представляют собой куда более гибкий инструмент, нежели const, потому что это вычисляемое поле. Удачного применения и спасибо за внимание.

Комментариев нет: