Слайд 2CTS (общая система типов)
CTS (общая система типов) представляет собой формальную спецификацию,
в которой описано то, как должны быть определены типы для того, чтобы они могли обслуживаться в CLR-среде.
Слайд 3Тип Объект
Все объекты косвенно происходят от единого базового класса, определенного в составе
CTS. Этот базовый класс — System.Object.
Слайд 4Значимые и ссылочные типы
Концепция создания языка, где любая сущность является объектом, не
нова. Если попытаться сложить два значения типа double, при этом реально выделять объекты в куче, то выделение памяти будет чрезвычайно неэффективно.
Слайд 5Значимые типы
Для значимого типа используется прямая адресация, значение хранит собственно данные, и
память для них отводится, как правило, в стеке.
Слайд 6Ссылочные типы
Для ссылочного типа значение задает ссылку на область памяти в "куче",
где расположен соответствующий объект.
Слайд 8Встроенные типы
Пример:
bool IsTrue = false;
Слайд 9Встроенные типы
Пример:
int a = 123;
long b,c,d;
Слайд 11Встроенные типы
Пример:
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.
Слайд 18Приведение типов
Приведение типов – это преобразование значения одного типа в значение другого типа.
Слайд 19Приведение типов
Выделяют приведения типов:
явные (англ. 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 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 к объекту
типа ContractEmployee, поскольку нет гарантии, что этот объект поддерживает интерфейс, определенный классом ContractEmployee. Поэтому в случае нисходящего приведения используется явное приведение:
...
class CastExampleS {
public static void Main ()
{// Нисходящее приведение не сработает.
ContractEmployee ce = (ContractEmployee)new Employee(); }}