Общая система типов CTS

Содержание

Слайд 2

CTS (общая система типов) CTS (общая система типов) представляет собой формальную

CTS (общая система типов)

CTS (общая система типов) представляет собой формальную

спецификацию, в которой описано то, как должны быть определены типы для того, чтобы они могли обслуживаться в CLR-среде.
Слайд 3

Тип Объект Все объекты косвенно происходят от единого базового класса, определенного

Тип Объект

Все объекты косвенно происходят от единого базового класса, определенного в

составе CTS. Этот базовый класс — System.Object.
Слайд 4

Значимые и ссылочные типы Концепция создания языка, где любая сущность является

Значимые и ссылочные типы

Концепция создания языка, где любая сущность является объектом,

не нова. Если попытаться сложить два значения типа double, при этом реально выделять объекты в куче, то выделение памяти будет чрезвычайно неэффективно.
Слайд 5

Значимые типы Для значимого типа используется прямая адресация, значение хранит собственно

Значимые типы

Для значимого типа используется прямая адресация, значение хранит собственно данные,

и память для них отводится, как правило, в стеке.
Слайд 6

Ссылочные типы Для ссылочного типа значение задает ссылку на область памяти

Ссылочные типы

Для ссылочного типа значение задает ссылку на область памяти в

"куче", где расположен соответствующий объект.
Слайд 7

Иерархия типов

Иерархия типов

Слайд 8

Встроенные типы Пример: bool IsTrue = false;

Встроенные типы

Пример:
bool IsTrue = false;

Слайд 9

Встроенные типы Пример: int a = 123; long b,c,d;

Встроенные типы

Пример:
int a = 123;
long b,c,d;

Слайд 10

Встроенные типы

Встроенные типы

Слайд 11

Встроенные типы Пример: object a = 123;

Встроенные типы

Пример:
object a = 123;

Слайд 12

Упаковка и распаковка Как же эти различные категории типов обеспечивают более

Упаковка и распаковка

Как же эти различные категории типов обеспечивают более эффективную

работу системы?
Это делается с помощью упаковки (boxing). В простейшем случае при упаковке размерный тип преобразуется в ссылочный. В обратном случае ссылочный тип распаковывается (unbox) в размерный.
Слайд 13

Упаковка и распаковка Объект лишь тогда является объектом, когда это необходимо.

Упаковка и распаковка

Объект лишь тогда является объектом, когда это необходимо.
int foo

= 42; // Размерный тип.
object bar = foo; // Переменная foo упакована в bar.
А теперь выполним явное приведение типов, чтобы преобразовать bar обратно в размерный тип:
int foo = 42; // Размерный тип.
object bar = foo; // Переменная foo упакована в bar.
int foo2 = (int) bar; // Распаковка и приведение к типу int.
Слайд 14

Тип Объект: открытые методы

Тип Объект: открытые методы

Слайд 15

Тип Объект: открытые методы

Тип Объект: открытые методы

Слайд 16

Тип Объект: защищенные методы

Тип Объект: защищенные методы

Слайд 17

Тип Объект: защищенные методы

Тип Объект: защищенные методы

Слайд 18

Приведение типов Приведение типов – это преобразование значения одного типа в значение другого типа.

Приведение типов

Приведение типов – это преобразование значения одного типа в значение другого типа.

Слайд 19

Приведение типов Выделяют приведения типов: явные (англ. explicit); int num =

Приведение типов

Выделяют приведения типов:
явные (англ. explicit);
int num = 2147483647;
long bigNum =

num;
неявные (англ. implicit).
double x = 1234.7;
int a;
a = (int)x; // a = 1234
Слайд 20

Приведение типов class Employee { } class ContractEmployee : Employee {

Приведение типов

class Employee { } 
class ContractEmployee : Employee { }
class CastExamplel
{
public

static void Main () {
Employee e = new ContractEmployee(); } }
Этот код будет работать, поскольку всегда подразумевается восходящее приведение (upcast) производного класса к его базовому классу.
Слайд 21

Приведение типов А вот такой код недопустим, так как компилятор не

Приведение типов

А вот такой код недопустим, так как компилятор не предоставляет

неявное нисходящее приведение (downcast).

class CastExample2 {
public static void Main ()
{
ContractEmployee ce = new Employee (); // He будет
// компилироваться.
} }
Слайд 22

Приведение типов Вы не сможете выполнить нисходящее приведение объекта типа Employee

Приведение типов

Вы не сможете выполнить нисходящее приведение объекта типа Employee к

объекту типа ContractEmployee, поскольку нет гарантии, что этот объект поддерживает интерфейс, определенный классом ContractEmployee. Поэтому в случае нисходящего приведения используется явное приведение:
...
class CastExampleS {
public static void Main ()
{// Нисходящее приведение не сработает.
ContractEmployee ce = (ContractEmployee)new Employee(); }}