Net framework 5, а также среды Visual Studio 2012 и C#


Глава.7 .Константы.и.поля Поля



Download 6,27 Mb.
Pdf ko'rish
bet152/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   148   149   150   151   152   153   154   155   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

212
Глава.7 .Константы.и.поля
Поля
Поле
(field) — это член данных, который хранит экземпляр значимого типа или 
ссылку на ссылочный тип. В табл. 7.1 приведены модификаторы, применяемые по 
отношению к полям.
таблица 7.1.
.Модификаторы.полей
термин CLR
термин C#
Описание
Static
static
Поле является частью состояния типа, а не объекта
Instance
(по умол-
чанию)
Поле связано с экземпляром типа, а не самим типом
InitOnly
readonly
Запись в поле разрешается только из кода конструктора
Volatile
volatile
Код, обращающийся к полю, не должен оптимизироваться 
компилятором, CLR или оборудованием с целью обеспе-
чения безопасности потоков. Неустойчивыми (volatile) 
могут объявляться только следующие типы: все ссылоч-
ные типы, Single, Boolean, Byte, SByte, Int16, UInt16, 
Int32, UInt32, Char, а также все перечислимые типы, 
основанные на типе Byte, SByte, Int16, UInt16, Int32 или 
UInt32. Неустойчивые поля рассматриваются в главе 2
Как видно из таблицы, общеязыковая среда (CLR) поддерживает поля как 
типов (статические), так и экземпляров (нестатические). Динамическая память 
для хранения поля типа выделяется в пределах объекта типа, который создается 
при загрузке типа в домен приложений (см. главу 22), что обычно происходит при 
JIT-компиляции любого метода, ссылающегося на этот тип. Динамическая память 
для хранения экземплярных полей выделяется при создании экземпляра данного 
типа.
Поскольку поля хранятся в динамической памяти, их значения можно получить 
лишь в период выполнения. Поля также решают проблему управления версиями, 
возникающую при использовании констант. Кроме того, полю можно назначить 
любой тип данных, поэтому при определении полей можно не ограничиваться 
встроенными элементарными типами компилятора (что приходится делать при 
определении констант).
CLR поддерживает поля, предназначенные для чтения и записи (изменяемые), 
а также поля, предназначенные только для чтения (неизменяемые). Большинство 
полей изменяемые. Это значит, что во время исполнения кода значение таких полей 
может многократно меняться. Данные же в неизменяемые поля можно записывать 
только при исполнении конструктора (который вызывается лишь раз — при соз-
дании объекта). Компилятор и механизм верификации гарантируют, что ни один 


213
Поля
метод, кроме конструктора, не сможет записать данные в поле, предназначенное 
только для чтения. Замечу, что для изменения такого поля можно задействовать 
отражение.
Попробуем решить проблему управления версиями в примере из раздела 
«Константы», используя статические неизменяемые поля. Вот новая версия кода 
DLL-сборки:
using System;
public sealed class SomeLibraryType {
// Модификатор static необходим, чтобы поле
// ассоциировалось с типом, а не экземпляром
public static readonly Int32 MaxEntriesInList = 50; 
}
Это единственное изменение, которое придется внести в исходный текст, при 
этом код приложения можно вовсе не менять, но чтобы увидеть его новые свойства, 
его придется перекомпилировать. Теперь при исполнении метода 
Main
этого при-
ложения CLR загружает DLL-сборку (так как она требуется во время выполнения) 
и извлекает значение поля 
MaxEntriesInList
из динамической памяти, выделенной 
для его хранения. Естественно, это значение равно 50.
Допустим, разработчик сборки изменил значение поля с 50 на 1000 и скомпо-
новал сборку заново. При повторном исполнении код приложения автоматически 
задействует новое значение — 1000. В этом случае не обязательно компоновать код 
приложения заново, оно просто работает в том виде, в котором было (хотя и чуть 
медленнее). Однако этот сценарий предполагает, что у новой сборки нет строгого 
имени, а политика управления версиями приложения заставляет CLR загружать 
именно эту новую версию сборки.
В следующем примере показано, как определять изменяемые статические поля, 
а также изменяемые и неизменяемые экземплярные поля:
public sealed class SomeType {
// Статическое неизменяемое поле. Его значение рассчитывается 
// и сохраняется в памяти при инициализации класса во время выполнения
public static readonly Random s_random = new Random();
// Статическое изменяемое поле
private static Int32 s_numberOfWrites = 0;
// Неизменяемое экземплярное поле
public readonly String Pathname = "Untitled";
// Изменяемое экземплярное поле
private System.IO.FileStream m_fs;
public SomeType(String pathname) {
// Эта строка изменяет значение неизменяемого поля
// В данном случае это возможно, так как показанный далее код
// расположен в конструкторе
продолжение



214
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   148   149   150   151   152   153   154   155   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish