louis vuitton bag moncler jacka ugg boots mbt sko louis vuitton oslo moncler ugg www.steklo1.ru
   Поиск
 

Изучаем C Sharp (C#)

Программирование на C Sharp (C#) с нуля

Cи Шарп это просто Simple C#
Логин Пароль Вход Регистрация
Главная
Изучаем C#
Web-приложения
Win-приложения
Web-сервисы
ADO.NET
FrameWork
Алгоритмы
Исходники
Классы
Среда разработки
Статьи
Форум
FAQ
О Проекте
Обратная связь
Отблагодарить
Rambler's Top100

Введение в классы - Константы и неизменяемые поля (часть 6)

КОНСТАНТЫ И НЕИЗМЕНЯЕМЫЕ ПОЛЯ


Ранее мы уже рассказывали про константы, в этом разделе еще раз будет описана их специфика и дана сравнительная характеристика с неизменяемыми полями. Можно с уверенностью сказать, что возникнут ситуации, когда изменение некоторых полей при выполнении приложения будет нежелательно, например, это могут быть файлы данных, от которых зависит ваше приложение, значение pi для математического класса или любое другое используемое в приложении значение, о котором вы знаете, что оно никогда не изменится. В этих ситуациях С# позволяет определять члены тесно связанных типов: константы и неизменяемые поля.
Константы
Из названия легко догадаться, что константы (constants), представленные ключевым словом const,— это поля, остающиеся постоянными в течение всего времени жизни приложения. Определяя что-либо как const, достаточно помнить два правила. Во-первых, константа — это член, значение которого устанавливается в период компиляции программистом или компилятором (в последнем случае это значение по умолчанию). Во-вторых, значение члена-константы должно быть записано в виде литерала.
Чтобы определить поле как константу, укажите перед определяемым членом ключевое слово const:


using System;

class MagicNumbers
{
    public const double pi = 3.1415;
    public const int g = 10;
    class ConstApp
    {
        public static void Main()
        {
            Console.WriteLine("pi = {0}, g = {1}", MagicNumbers.pi, MagicNumbers.g);
        }
    }
}



Обратите внимание на один важный момент, связанный с этим кодом. Клиенту нет нужды создавать экземпляр класса MagicNumbers, поскольку по умолчанию члены const являются статическими.
Неизменяемые поля
Поле, определенное как const, ясно указывает, что программист намерен поместить в него постоянное значение. Это плюс. Но оно работает, только если известно значение подобного поля в период компиляции. А что же делать программисту, когда возникает потребность в поле, чье значение не известно до периода выполнения, но после инициализации не должно меняться? Эта проблема (которая обычно остается нерешенной в большинстве других языков) разрешена разработчиками языка С# с помощью неизменяемого поля (read-only field).
Определяя поле с помощью ключевого слова readonly, вы можете установить значение поля лишь в одном месте — в конструкторе. После этого поле не могут изменить ни сам класс, ни его клиенты. Допустим, для графического приложения нужно отслеживать разрешение экрана. Справиться с этой проблемой с помощью const нельзя, так как до периода выполнения приложение не может определить разрешение экрана у пользователя. Поэтому лучше всего использовать такой код:


using System;

class GraphicsPackage
{
    public readonly int ScreenWidth;
    public readonly int ScreenHeighz;
    public GraphicsPackage()
    {
        this.ScreenWidth = 1024;
        this.ScreenHeight = 768;
    }
    class ReadOnlyApp
    {
        public static void Main()
        {
            GraphicsPackage graphics = new GraphicsPackage();
            Console.WriteLine("Ширина = {0}, Высота = {1}", graphics.ScreenWidth, graphics.ScreenHeight);
        }
    }
}



На первый взгляд кажется: это то, что нужно. Но есть одна маленькая проблема: определенные нами неизменяемые поля являются полями экземпляра, а значит, чтобы задействовать их, пользователю придется создавать экземпляры класса. Может, это и не проблема, и код даже пригодится, когда значение неизменяемого поля определяется способом создания экземпляра класса. Однако если вам нужна константа, по определению статическая, но инициализируемая в период выполнения?
Тогда нужно определить поле с обоими модификаторами — static и readonly, а затем создать особый, статический тип конструктора. Статические конструкторы (static constructor) используются для инициализации статических, неизменяемых и других полей. Здесь был изменен предыдущий пример так, чтобы сделать поля, определяющие разрешение экрана, статическими и неизменяемыми, а также добавлен статический конструктор. Обратите внимание на ключевое слово static, добавленное к определению конструктора:


using System;

class ScreenResolution
{
    public static readonly int ScreenWidth;
    public static readonly int ScreenHeight;
    static ScreenResolution()
    {
        // code would be here to
        // calculate resolution
        ScreenWidth = 1024;
        ScreenHeight = 768;
    }
    class ReadOnlyApp
    {
        public static void Main()
        {
            Console.WriteLine("Ширина = {0}, Высота = {1}", ScreenResolution.ScreenMidth, ScreenBesolution.ScreenHeight);
        }
    }
}



Предыдущая стр.    Оглавление    Следующая стр.
Средняя оценка: (4,33 - 3 голосов)
Для оценки необходимо зарегистрироваться


Только зарегистрировавшиеся пользователи могут оставлять комментарии



Практический обучающий видео-курс "Основы C#"

От профессионального
разработчика для начинающих
и опытных программистов!

Кликните, чтобы изучить
язык C# с нуля и научиться
писать программы под платформу .NET!