net framework и С#, весна 2015: Виды типов

26
Толстиков Никита [email protected] Введение 20.02.2015 1 Введение

Upload: cs-center

Post on 15-Apr-2017

239 views

Category:

Documents


3 download

TRANSCRIPT

Толстиков Никита [email protected]

Введение

20.02.2015 1Введение

Толстиков Никита

План лекции

• Hello World!• Компиляция!• Декомпиляция!• Типы и переменные

20.02.2015 2Введение

Толстиков Никита20.02.2015 3Введение

using System;!using System.Collections.Generic;!using System.Linq;!using System.Text;!using System.Threading.Tasks;!!namespace HelloWorld!{! class Program! {! static void Main(string[] args)! {! Console.WriteLine("Hello world!!!");! }! }!}

Толстиков Никита

Компиляция

20.02.2015 4Введение

• В Visual Studio:!Build -> Build Solution или Ctrl–Shift-B

• В командной строке: csc Program.cs

Толстиков Никита

C# code

Компиляция

20.02.2015 5Введение

Compiler

VB code

F# code

CIL

CLR

00110001001001111010000110

1101110011

Common Language!Infrastructure

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

1. Код на исходном языке программирования (С#, VB.NET, Java, Python и т.д.)

3. Common Intermediate Language (ECMA-335) – промежуточный кроссплатформенный язык, исполняемый CLR. Хранится в byte коде4. Платформозависимая среда исполнения (Common Language Runtime) компилирует и CIL под текущую платформу и исполняет его5. Скомпилированный «на лету» код (JIT code) исполняется на процессоре

Толстиков Никита

Декомпиляция

20.02.2015 6Введение

• Воспользоваться IL Disassembler:!Ildsam Program.exe !!!!!!

• Воспользоваться dotPeek:

.method private hidebysig static void Main(string[] args) cil managed!{! .entrypoint! // Code size 13 (0xd)! .maxstack 8! IL_0000: nop! IL_0001: ldstr "Hello world!!!"! IL_0006: call void [mscorlib]System.Console::WriteLine(string)! IL_000b: nop! IL_000c: ret!} // end of method SomeClass::Main

Толстиков Никита

Типы и переменные

20.02.2015 7Введение

• Во время исполнения CLR знает конкретный тип для каждого объекта (никакие типы не пропадают, как в Java)!

• Для каждого типа во время исполнения создается объект, описывающий его структуру

Толстиков Никита

Типы и переменные

20.02.2015 8Введение

• Все типы неявно наследуются от типа System.Object//Implicitly derived from Object!class Employee ! {! ...! }

Толстиков Никита

Типы и переменные

20.02.2015 9Введение

/// Returns a string that represents the current object!public virtual string ToString()!!/// The exact runtime type of the current instance.!public Type GetType()!!/// Determines whether the specified object instances are equal.!public virtual bool Equals(object obj)!!/// Serves as a hash function for a particular type.!public virtual int GetHashCode()

• По этому все типы имеют следующие методы:!!!!!

Толстиков Никита

Типы и объекты

20.02.2015 10Введение

• Создадим объект типа Employee:

static void Main(string[] args)!{!! Employee empl = new Employee(“Parametr1”);!}

имя переменной

имя типа аргументы конструктора

Толстиков Никита

Этапы создания объекта

20.02.2015 11Введение

0. Перед исполнением метода CLR проверяет, что для всех используемых внутри типов созданы их описания!

1. Высчитывается сколько байтов памяти нужно для создания объекта!

2. Выделяется место на куче и заполняется нулями!

3. Заполняются служебные поля!4. Вызывается конструктор

Толстиков Никита

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

20.02.2015 12Введение

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

Employee e = new Employee();!Object o = new Object();!!o = e; //Приведение к родителю – может быть неявным!!e = (Employee)o; //Остальные приведения – должны указываться

Толстиков Никита

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

20.02.2015 13Введение

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

Employee e = new Employee();!Object o = new Object();!!o = e; //Приведение к родителю – может быть неявным!!e = (Employee)o; //Остальные приведения – должны указываться

Толстиков Никита

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

20.02.2015 14Введение

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

Employee e = new Employee();!Object o = new Object();!!o = e; //Приведение к родителю – может быть неявным!!e = (Employee)o; //Остальные приведения – должны указываться

Толстиков Никита

Проверка на совместимость

20.02.2015 15Введение

• Оператор is возвращает true, если типы совместимы, иначе false:!!

!

• Оператор as возвращает приведённый объект или null:

Employee e = new Employee();!Object o = new Object();!Boolean b1 = o is Object; //true!Boolean b2 = o is Employee; //false

Employee e = o as Employee;

Толстиков Никита

Виды типов

20.02.2015 16Введение

1. Примитивные типы – типы, которые используются на уровне CIL!!

!

• Список примитивных типов здесь!• Можно представлять как:

int a = 0; ! ! // Most convenient syntax ! System.Int32 b = 0; ! ! // Convenient syntax ! int c = new int(); ! ! // Inconvenient syntax ! System.Int32 d = new System.Int32(); // Most inconvenient syntax

using int = System.Int32; !using uint = System.UInt32;!! ...

Толстиков Никита

Примитивные типы

20.02.2015 17Введение

• Поддерживают арифметические и логические операторы по умолчанию (такие как +, *, /, %, &, ^, |, ==, !=, >, <, >=, <=, <<, >>, ~, !, ++, и т.д)

Int32 x = 100; // Оператор присваивания!x += y * 23; // Произведение и присваивание с прибавлением!Boolean lessThanFifty = (y < 50); // Логическое меньше и присваивание

Толстиков Никита

Приведение примитивных типов

20.02.2015 18Введение

• Компилятор поддерживает неявное приведение, если это «безопасно», в том плане, что не может быть потери данных:Int32 i = 5; // Implicit cast from Int32 to Int32 !Int64 l = i; // Implicit cast from Int32 to Int64 !Single s = i; // Implicit cast from Int32 to Single !Byte b = (Byte)i; // Explicit cast from Int32 to Byte !Int16 v = (Int16)s; // Explicit cast from Single to Int16

Толстиков Никита

Проверка на переполнение

20.02.2015 19Введение

• По умолчанию проверка на переполнение отсутствует!

• Включить проверку на этапе компиляции: /checked+!

• Использовать директивы checked/unchecked:

UInt32 invalid = unchecked((UInt32) (1)); // OK!Byte b = 100; !b = checked((Byte) (b + 200)); // OverflowException is thrown

Толстиков Никита

Виды типов

20.02.2015 20Введение

2. Ссылочные типы представляют собой указатели на объекты в хипе. Наследуются от System.Object!!

3. Типы значений хранят значения своих полей на стеке исполнения. Наследуется от System.ValueType

class ReferenceEmployee { }

struct ValueEmployee { }

Толстиков Никита

Boxing

20.02.2015 21Введение

// Создадим value type.! struct Point! { public Int32 x, y; } public sealed class Program! { public static void Test() { ArrayList a = new ArrayList(); Point p; // Создадим объект типа Point (не в куче).! for (Int32 i = 0; i < 10; i++) { p.x = p.y = i; // Проинициализируем его поля! a.Add(p); // Добавим точку в массив ! ! }! //...! }! }!!! public virtual Int32 Add(Object value);

Толстиков Никита

Boxing

20.02.2015 22Введение

Boxing – процесс преобразования типа значений в ссылочный тип!1. Выделение памяти в куче!2. Копирование данных в выделенное место!3. Возвращение адреса!

!!!

Толстиков Никита

Unboxing

20.02.2015 23Введение

Point p = (Point)a[0];!!Unboxing – процесс преобразования ссылочного

типа в тип значений!!• На уровне С# — это копирование полей!• На уровне CIL — это получение указателя на структуру!!

Толстиков Никита

Unboxing

20.02.2015 24Введение

Point p = (Point)a[0];!!Unboxing – процесс преобразования ссылочного

типа в тип значений!!• На уровне С# — это копирование полей!• На уровне CIL — это получение указателя на структуру!!

Толстиков Никита

Boxing / Unboxing

20.02.2015 25Введение

Int32 v = 5; // Создадим unboxing переменную!Object o = v; // О ссылается на box Int32.!v = 123; // Изменить unbox на 123!Console.WriteLine(v + ", " + (Int32)o); // Показать "123, 5"

Сколько в этом коде box/unbox преобразований?

Толстиков Никита

The End

20.02.2015 26Введение