Студопедия — Partial 11 страница
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Partial 11 страница






Тип; в объявлении_поля; указывает тип членов, вводимых объявлением. За типом следует список деклараторов_переменных;, каждый из которых вводит новый член. Декларатор_переменной; состоит из идентификатора;, именующего член, за которым необязательно следуют лексема «=» и инициализатор_переменной; (§10.5.5), задающий начальное значение члена.

Тип; поля должен быть, по крайней мере, таким же доступным, как само поле (§3.5.4).

Значение поля получается в выражении с помощью простого_имени; (§7.6.2) или доступа_к_члену; (§7.6.4). Значение поля с доступом не только для чтения изменяется с помощью присваивания; (§7.17). Значение поля с доступом не только для чтения можно и получать, и изменять с помощью операторов постфиксного увеличения и уменьшения (§7.6.9) и операторов префиксного увеличения и уменьшения (§7.7.5).

Объявление поля, объявляющее несколько полей, эквивалентно нескольким объявлениям одиночных полей с теми же атрибутами, модификаторами и типом. Пример.

class A
{
public static int X = 1, Y, Z = 100;
}

эквивалентно

class A
{
public static int X = 1;
public static int Y;
public static int Z = 100;
}

10.5.1 Статические поля и поля экземпляров

Если объявление поля включает модификатор static, поля, введенные этим объявлением, являются статическими полями. Если нет модификатора static, введенные объявлением поля являются полями экземпляров;. Статические поля и поля экземпляров – это два из нескольких видов переменных (§5), поддерживаемых языком C#, и иногда их называют статическими переменными и переменными экземпляров, соответственно.

Статическое поле не является частью конкретного экземпляра, а используется совместно всеми экземплярами закрытого типа (§4.4.2). Независимо от того, сколько создано экземпляров закрытого типа класса, всегда существует только одна копия статического поля для соответствующей области приложения.

Пример.

class C<V>
{
static int count = 0;

public C() {
count++;
}

public static int Count {
get { return count; }
}
}

 

class Application
{
static void Main() {
C<int> x1 = new C<int>();
Console.WriteLine(C<int>.Count); // Prints 1

C<double> x2 = new C<double>();
Console.WriteLine(C<int>.Count); // Prints 1

C<int> x3 = new C<int>();
Console.WriteLine(C<int>.Count); // Prints 2
}
}

Поле экземпляра принадлежит экземпляру. В частности, каждый экземпляр класса содержит отдельный набор всех полей экземпляров этого класса.

Если к полю производится обращение через доступ_к_члену (§7.6.4) вида E.M, если M является статическим полем, E должно означать тип, содержащий M, а если M является полем экземпляра, E должно означать экземпляр типа, содержащего M.

Различия между статическими членами и членами экземпляров рассматриваются в разделе §10.3.7.

10.5.2 Поля только для чтения;

Если объявление_поля; включает модификатор readonly, поля, введенные этим объявлением, являются полями только для чтения. Прямые присваивания полям только для чтения могут быть только как часть этого объявления или в конструкторе экземпляров, либо в статическом конструкторе в этом же классе (присваивание полям только для чтения в этих контекстах можно делать многократно). А именно, прямые присваивания полю readonly разрешены только в следующих контекстах:

· в деклараторе_переменной;, который вводит это поле (включением в объявление инициализатора_переменной;);

· для поля экземпляра в конструкторах экземпляров того класса, который содержит объявление поля; для статического поля в статическом конструкторе того класса, который содержит объявление поля. Это также единственные контексты, в которых допускается передача поля readonly в качестве параметров out или ref.

Попытка присваивания полю readonly или передачи его в качестве параметра out или ref в любом другом контексте является ошибкой времени компиляции.

10.5.2.1 Использование статических полей только для чтения вместо констант

Поле static readonly полезно, если требуется символическое имя для значения константы, но тип значения недопустим в объявлении const, или если значение не может быть вычислено во время компиляции. Пример.

public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);

private byte red, green, blue;

public Color(byte r, byte g, byte b) {
red = r;
green = g;
blue = b;
}
}

В этом примере члены Black, White, Red, Green и Blue нельзя объявить как const, так как их значения нельзя вычислить во время компиляции. Зато объявление их как static readonly имеет почти такой же результат.

10.5.2.2 Отслеживание версий констант и статических полей только для чтения

Константы и поля только для чтения имеют разную бинарную семантику отслеживания версий. Если выражение ссылается на константу, значение этой константы получается во время компиляции, но если выражение ссылается на поле только для чтения, значение этого поля известно только во время выполнения. Рассмотрим приложение, состоящее из двух отдельных программ.

using System;

namespace Program1
{
public class Utils
{
public static readonly int X = 1;
}
}

namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
}
}
}

Пространства имен Program1 и Program2 обозначают две программы, компилируемые отдельно. Поскольку Program1.Utils.X объявлено как статическое поле только для чтения, выходное значение оператора Console.WriteLine не известно во время компиляции, но получается во время выполнения. Таким образом, если X изменен и Program1 перекомпилирована, оператор Console.WriteLine выведет новое значение, даже если Program2 не перекомпилирована. Но если бы X был константой, значение X было бы получено при компиляции Program2 и осталось бы независимым от изменений в Program1 до перекомпиляции Program2.







Дата добавления: 2015-09-07; просмотров: 447. Нарушение авторских прав; Мы поможем в написании вашей работы!



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

Методика исследования периферических лимфатических узлов. Исследование периферических лимфатических узлов производится с помощью осмотра и пальпации...

Роль органов чувств в ориентировке слепых Процесс ориентации протекает на основе совместной, интегративной деятельности сохранных анализаторов, каждый из которых при определенных объективных условиях может выступать как ведущий...

Лечебно-охранительный режим, его элементы и значение.   Терапевтическое воздействие на пациента подразумевает не только использование всех видов лечения, но и применение лечебно-охранительного режима – соблюдение условий поведения, способствующих выздоровлению...

Принципы и методы управления в таможенных органах Под принципами управления понимаются идеи, правила, основные положения и нормы поведения, которыми руководствуются общие, частные и организационно-технологические принципы...

ПРОФЕССИОНАЛЬНОЕ САМОВОСПИТАНИЕ И САМООБРАЗОВАНИЕ ПЕДАГОГА Воспитывать сегодня подрастающее поколение на со­временном уровне требований общества нельзя без по­стоянного обновления и обогащения своего профессио­нального педагогического потенциала...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия