Слайд 2CTS (общая система типов)
CTS (общая система типов) представляет собой формальную спецификацию,
![CTS (общая система типов) CTS (общая система типов) представляет собой формальную спецификацию,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-1.jpg)
в которой описано то, как должны быть определены типы для того, чтобы они могли обслуживаться в CLR-среде.
Слайд 3Тип Объект
Все объекты косвенно происходят от единого базового класса, определенного в составе
![Тип Объект Все объекты косвенно происходят от единого базового класса, определенного в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-2.jpg)
CTS. Этот базовый класс — System.Object.
Слайд 4Значимые и ссылочные типы
Концепция создания языка, где любая сущность является объектом, не
![Значимые и ссылочные типы Концепция создания языка, где любая сущность является объектом,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-3.jpg)
нова. Если попытаться сложить два значения типа double, при этом реально выделять объекты в куче, то выделение памяти будет чрезвычайно неэффективно.
Слайд 5Значимые типы
Для значимого типа используется прямая адресация, значение хранит собственно данные, и
![Значимые типы Для значимого типа используется прямая адресация, значение хранит собственно данные,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-4.jpg)
память для них отводится, как правило, в стеке.
Слайд 6Ссылочные типы
Для ссылочного типа значение задает ссылку на область памяти в "куче",
![Ссылочные типы Для ссылочного типа значение задает ссылку на область памяти в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-5.jpg)
где расположен соответствующий объект.
Слайд 8Встроенные типы
Пример:
bool IsTrue = false;
![Встроенные типы Пример: bool IsTrue = false;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-7.jpg)
Слайд 9Встроенные типы
Пример:
int a = 123;
long b,c,d;
![Встроенные типы Пример: int a = 123; long b,c,d;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-8.jpg)
Слайд 11Встроенные типы
Пример:
object a = 123;
![Встроенные типы Пример: object a = 123;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-10.jpg)
Слайд 12Упаковка и распаковка
Как же эти различные категории типов обеспечивают более эффективную работу
![Упаковка и распаковка Как же эти различные категории типов обеспечивают более эффективную](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-11.jpg)
системы?
Это делается с помощью упаковки (boxing). В простейшем случае при упаковке размерный тип преобразуется в ссылочный. В обратном случае ссылочный тип распаковывается (unbox) в размерный.
Слайд 13Упаковка и распаковка
Объект лишь тогда является объектом, когда это необходимо.
int foo =
![Упаковка и распаковка Объект лишь тогда является объектом, когда это необходимо. int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-12.jpg)
42; // Размерный тип.
object bar = foo; // Переменная foo упакована в bar.
А теперь выполним явное приведение типов, чтобы преобразовать bar обратно в размерный тип:
int foo = 42; // Размерный тип.
object bar = foo; // Переменная foo упакована в bar.
int foo2 = (int) bar; // Распаковка и приведение к типу int.
Слайд 18Приведение типов
Приведение типов – это преобразование значения одного типа в значение другого типа.
![Приведение типов Приведение типов – это преобразование значения одного типа в значение другого типа.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-17.jpg)
Слайд 19Приведение типов
Выделяют приведения типов:
явные (англ. explicit);
int num = 2147483647;
long bigNum = num;
неявные
![Приведение типов Выделяют приведения типов: явные (англ. explicit); int num = 2147483647;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-18.jpg)
(англ. implicit).
double x = 1234.7;
int a;
a = (int)x; // a = 1234
Слайд 20Приведение типов
class Employee { }
class ContractEmployee : Employee { }
class CastExamplel
{
public static
![Приведение типов class Employee { } class ContractEmployee : Employee { }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-19.jpg)
void Main () {
Employee e = new ContractEmployee(); } }
Этот код будет работать, поскольку всегда подразумевается восходящее приведение (upcast) производного класса к его базовому классу.
Слайд 21Приведение типов
А вот такой код недопустим, так как компилятор не предоставляет неявное
![Приведение типов А вот такой код недопустим, так как компилятор не предоставляет](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-20.jpg)
нисходящее приведение (downcast).
…
class CastExample2 {
public static void Main ()
{
ContractEmployee ce = new Employee (); // He будет
// компилироваться.
} }
Слайд 22Приведение типов
Вы не сможете выполнить нисходящее приведение объекта типа Employee к объекту
![Приведение типов Вы не сможете выполнить нисходящее приведение объекта типа Employee к](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1089989/slide-21.jpg)
типа ContractEmployee, поскольку нет гарантии, что этот объект поддерживает интерфейс, определенный классом ContractEmployee. Поэтому в случае нисходящего приведения используется явное приведение:
...
class CastExampleS {
public static void Main ()
{// Нисходящее приведение не сработает.
ContractEmployee ce = (ContractEmployee)new Employee(); }}