ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

  << Предыдущий пост       Следующий пост >>  
От: ironMan
8. августа 2011 20:10

Ранее уже упоминалось о константах. Здесь лишь еще раз будет описана их специфика и дана сравнительная характеристика с неизменяемыми полями. Можно с уверенностью сказать, что возникнут ситуации, когда изменение некоторых полей при выполнении приложения будет нежелательно, например, это могут быть файлы данных, от которых зависит ваше приложение, значение 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}", MagicNurrbers.pi, MagicKumbers.g ) ;
}
}



Обратите внимание на один важный момент, связанный с этим кодом. Клиенту нет нужды создавать экземпляр класса MagicNumbers, поскольку по умолчанию члены const являются статическими.

Неизменяемые поля

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

Определяя поле с помощью ключевого слова readonly, вы можете установить значение поля лишь в одном месте — в конструкторе. После этого поле не могут изменить ни сам класс, ни его клиенты. Допустим, для графического приложения нужно отслеживать разрешение экрана. Справиться с этой проблемой с помощью const нельзя, так как до периода выполнения приложение не может определить разрешение экрана у пользователя. Поэтому лучше всего использовать такой код:



using System;

class GraphicsPackage
{
public readonlу 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.WriceLine( "Ширина = {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) ;
}
}



( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

 

Похожие записи


Виртуальные свойства в C#
Свойства, как и методы, могут быть перегружены в производных классах. Для свойств также могут задаваться модификаторы virtual, override или abstract. Подробно о наследовании говорилось в главе «Методы», сейчас я лишь хочу еще раз привести подробный пример использования механизма виртуализации с применением свойств: [code:c#] using System; enum COLORS { RE...

Вопросы на собеседовании C#, Net, ASP.NET, SQL
Продолжая тему вопросов на собеседовании. Нашел еще одну подборку. Оригинал лежит здесь . Перенес, чтобы не затерялось. Есть вполне вменяемые ответы (хотя, на некоторые вопросы ответил бы по-другому). Ответы находятся после списка вопросов, я их не менял. 23. Что такое шаблон проектирования Model/View/Controller? Как и зачем его применяют? 2...

Запрос информации об атрибутах класса в C#
Чтобы запросить тип или член о прикрепленных к ним атрибутах, нужно применить отражение (reflection).Способ получения атрибута зависит от типа члена, к которому производится запрос. Допустим, вам нужно узнать атрибут, определяющий удаленный сервер, на котором должен быть создан объект. Без атрибутов вам бы пришлось сохранять эту информацию в константе или файле ресурс...

Добавить комментарий




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий