Основы типов

Содержание

Слайд 2

Все типы — производные от System.Object

В CLR каждый объект прямо или косвенно

Все типы — производные от System.Object В CLR каждый объект прямо или
является производным от System. Object.
Это значит, что следующие определения типов идентичны: // Тип, неявно производный от 
Object class Employee { ... }
// Тип, явно производный от 
Object  class Employee : System.Object { ... }

Слайд 3

Примитивные
Ссылочные

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

Примитивные Ссылочные Значимые типы

Слайд 5

C# разрешает неявное приведение типа, если это преобразование «безопасно», то есть не

C# разрешает неявное приведение типа, если это преобразование «безопасно», то есть не
сопряжено с потерей данных; пример — преобразование из Int32 в Int64.

Int32 i = 5;         // Неявное приведение Int32 к Int32 Int64 l = i;         // Неявное приведение Int32 к Int64 Single s = i;        // Неявное приведение Int32 к Single Byte b = (Byte) i;   // Явное приведение Int32 к Byte Int16 v = (Int16) s; // Явное приведение Single к Int16

Слайд 6

Помимо приведения, компилятор «знает» и о другой особенности примитивных типов: к ним

Помимо приведения, компилятор «знает» и о другой особенности примитивных типов: к ним
применима литеральная форма записи. Литералы сами по себе считаются экземплярами типа, поэтому можно вызывать экземплярные методы, например, следующим образом:
Console.WriteLine(123.ToString() + 456.ToString()); // "123456"

Слайд 7

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

память для ссылочных типов всегда выделяется из управляемой кучи;
каждый

Ссылочные типы : память для ссылочных типов всегда выделяется из управляемой кучи;
объект, размещаемый в куче, содержит дополнительные члены, подлежащие инициализации;
незанятые полезной информацией байты объекта обнуляются (это касается полей);
размещение объекта в управляемой куче со временем инициирует сборку мусора.

Слайд 8

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

Экземпляры этих типов обычно размещаются в стеке потока
В представляющей экземпляр

Значимые типы : Экземпляры этих типов обычно размещаются в стеке потока В
переменной нет указателя на экземпляр;
Поля экземпляра размещаются в самой переменной
Поскольку переменная содержит поля экземпляра, то для работы с экземпляром не нужно выполнять разыменование (dereference) экземпляра
Благодаря тому, что экземпляры значимых типов не обрабатываются уборщиком мусора, уменьшается интенсивность работы с управляемой кучей и сокращается количество сеансов уборки мусора, необходимых приложению на протяжении его существования.

Слайд 9

Если тип называют классом (class), речь идет о ссылочном типе. Например, классы

Если тип называют классом (class), речь идет о ссылочном типе. Например, классы
System.Object, System.Exception, System.IO.FileStream и System.Random — это ссылочные типы

В свою очередь, значимые типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.Int32, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System. IO.FileAttributes и System.Drawing.FontStyle являются значимыми типами

Слайд 11

SomeVal v1 = new SomeVal(); // Размещается в стеке

Может показаться, что экземпляр SomeVal будет помещен в управляемую кучу. Однако

SomeVal v1 = new SomeVal(); // Размещается в стеке Может показаться, что
поскольку компилятор C# «знает», что SomeVal является значимым типом, в сгенерированном им коде экземпляр SomeVal будет помещен в стек потока

SomeVal v1; // Размещается в стеке

Здесь тоже создается IL-код, который помещает экземпляр SomeVal в стек потока и обнуляет все его поля. Единственное отличие в том, что экземпляр, созданный оператором new, C# «считает» инициализированным.

Слайд 12

// Две следующие строки компилируются, так как C# считает, 
// что поля в v1 инициализируются нулем
SomeVal v1 = new SomeVal();
Int32 a = v1.x;

// Две следующие строки компилируются, так как C# считает, // что поля

// Следующие строки вызовут ошибку компиляции, поскольку C# не считает, 
// что поля в v1 инициализируются нулем
SomeVal v1;
Int32 a = v1.x;
// error CS0170: Use of possibly unassigned field 'x'  // (ошибка CS0170: Используется поле 'x', которому не присвоено значение)

Слайд 13

Важнейшие отличия между значимыми и ссылочными типы:

Объекты значимого типа существуют в

Важнейшие отличия между значимыми и ссылочными типы: Объекты значимого типа существуют в
двух формах (см. следующий раздел): неупакованной (unboxed) и упакованной (boxed). Ссылочные типы бывают только в упакованной форме.
Значимые типы являются производными от System.ValueType. Этот тип имеет те же методы, что и System.Object. Однако System.ValueType переопределяет метод Equals, который возвращает true, если значения полей в обоих объектах совпадают. Кроме того, в System.ValueType переопределен метод GetHashCode, который создает хеш-код по алгоритму, учитывающему значения полей экземпляра объекта. Из-за проблем с производительностью в реализации по умолчанию, определяя собственные значимые типы значений, надо переопределить и написать свою реализацию методов Equals и GetHashCode
Поскольку в объявлении нового значимого или ссылочного типа нельзя указывать значимый тип в качестве базового класса, создавать в значимом типе новые виртуальные методы нельзя. Методы не могут быть абстрактными и неявно являются запечатанными (то есть их нельзя переопределить).
Имя файла: Основы-типов.pptx
Количество просмотров: 31
Количество скачиваний: 0