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



Download 6,27 Mb.
Pdf ko'rish
bet109/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   105   106   107   108   109   110   111   112   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

ВниМание
Многим.разработчикам.(в.частности,.тем,.кто.пишет.неуправляемый.код.на.C/C++).
деление.на.ссылочные.и.значимые.типы.поначалу.кажется.странным .В.неуправляе-
мом.коде.C/C++.вы.объявляете.тип,.и.уже.код.решает,.куда.поместить.экземпляр.
типа:.в.стек.потока.или.в.кучу.приложения .В.управляемом.коде.иначе:.разработчик,.
описывающий.тип,.указывает,.где.должны.размещаться.экземпляры.данного.типа,.
а.разработчик,.использующий.тип.в.своем.коде,.управлять.этим.не.может 
В следующем коде (и на рис. 5.2) продемонстрировано различие между ссылоч-
ными и значимыми типами:


152
Глава.5 .Примитивные,.ссылочные.и.значимые.типы
// Ссылочный тип (поскольку 'class')
class SomeRef { public Int32 x; }
// Значимый тип (поскольку 'struct')
struct SomeVal { public Int32 x; }
static void ValueTypeDemo() { 
SomeRef r1 = new SomeRef(); // Размещается в куче 
SomeVal v1 = new SomeVal(); // Размещается в стеке 
r1.x = 5; // Разыменовывание указателя 
v1.x = 5; // Изменение в стеке 
Console.WriteLine(r1.x); // Отображается "5" 
Console.WriteLine(v1.x); // Также отображается "5" 
// В левой части рис. 5.2 показан результат 
// выполнения предыдущих строк
SomeRef r2 = r1; // Копируется только ссылка (указатель) 
SomeVal v2 = v1; // Помещаем в стек и копируем члены
r1.x = 8; // Изменяются r1.x и r2.x 
v1.x = 9; // Изменяется v1.x, но не v2.x 
Console.WriteLine(r1.x); // Отображается "8" 
Console.WriteLine(r2.x); // Отображается "8" 
Console.WriteLine(v1.x); // Отображается "9" 
Console.WriteLine(v2.x); // Отображается "5" 
// В правой части рис. 5.2 показан результат 
// выполнения ВСЕХ предыдущих строк 
}
рис. 5.2.
.Разница.между.размещением.в.памяти.значимых.и.ссылочных.типов
В этом примере тип 
SomeVal
объявлен с ключевым словом 
struct
, а не более 
распространенным ключевым словом 
class
. В C# типы, объявленные как 
struct

являются значимыми, а объявленные как 
class
, — ссылочными. Между поведением 


153
Ссылочные.и.значимые.типы
ссылочных и значимых типов существуют существенные различия. Поэтому так 
важно представлять, к какому семейству относится тот или иной тип — к ссылочно-
му или значимому: ведь это может существенно повлиять на то, как вы выражаете 
свои намерения в коде.
В предыдущем примере есть следующая строка:
SomeVal v1 = new SomeVal(); // Размещается в стеке
Может показаться, что экземпляр 
SomeVal
будет помещен в управляемую кучу. 
Однако поскольку компилятор C# «знает», что 
SomeVal
является значимым типом, 
в сгенерированном им коде экземпляр 
SomeVal
будет помещен в стек потока. C# 
также обеспечивает обнуление всех полей экземпляра значимого типа.
Ту же строку можно записать иначе:
SomeVal v1; // Размещается в стеке
Здесь тоже создается IL-код, который помещает экземпляр 
SomeVal
в стек по-
тока и обнуляет все его поля. Единственное отличие в том, что экземпляр, создан-
ный оператором 
new
, C# «считает» инициализированным. Поясню эту мысль на 
следующем примере:
// Две следующие строки компилируются, так как C# считает, 
// что поля в v1 инициализируются нулем
SomeVal v1 = new SomeVal(); 
Int32 a = v1.x; 
// Следующие строки вызовут ошибку компиляции, поскольку C# не считает, 
// что поля в v1 инициализируются нулем
SomeVal v1; 
Int32 a = v1.x; 
// error CS0170: Use of possibly unassigned field 'x' 
// (ошибка CS0170: Используется поле 'x', которому не присвоено значение)
Проектируя свой тип, проверьте, не использовать ли вместо ссылочного типа 
значимый. Иногда это позволяет повысить эффективность кода. Сказанное особенно 
справедливо для типа, удовлетворяющего 
всем
перечисленным далее условиям.
‰
Тип ведет себя подобно примитивному типу. В частности, это означает, что тип 
достаточно простой и у него нет членов, способных изменить экземплярные 
поля типа, в этом случае говорят, что тип 
неизменяемый
(immutable). На самом 
деле, многие значимые типы рекомендуется помечать спецификатором 
readonly
(см. главу 7).
‰
Тип не обязан иметь любой другой тип в качестве базового.
‰
Тип не имеет производных от него типов.
Также необходимо учитывать размер экземпляров типа, потому что по умолча-
нию аргументы передаются по значению; при этом поля экземпляров значимого 
типа копируются, что отрицательно сказывается на производительности. Повторюсь: 
для метода, возвращающего значимый тип, поля экземпляра копируются в память, 


154
Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   105   106   107   108   109   110   111   112   ...   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