Скачать презентацию C и NET Framework Лекция 2 Автор Скачать презентацию C и NET Framework Лекция 2 Автор

25/10/2013 C# lect2.ppt

  • Количество слайдов: 106

C# и. NET Framework Лекция 2 C# и. NET Framework Лекция 2

Автор материала: Семён Факторович, НГУ оф. сайт курса: http: //bit. ly/nsudotnet Автор материала: Семён Факторович, НГУ оф. сайт курса: http: //bit. ly/nsudotnet

Сегодня в программе Немного о ключевом слове static и пространствах имен (namespaces) Ссылки (references): Сегодня в программе Немного о ключевом слове static и пространствах имен (namespaces) Ссылки (references): куда подевались мои указатели? Reference types и value types (очень важный момент) Fields vs. properties, или кто такие геттеры и сеттеры?

Ключевое слово static Ключевое слово static

Ключевое слово static Вместо глобальных переменных — статические поля Ключевое слово static Вместо глобальных переменных — статические поля

Ключевое слово static Вместо глобальных переменных — статические поля Ключевое слово static Вместо глобальных переменных — статические поля

Ключевое слово static Вместо глобальных функций — статические методы классов Ключевое слово static Вместо глобальных функций — статические методы классов

Ключевое слово static Вместо глобальных функций — статические методы классов Ключевое слово static Вместо глобальных функций — статические методы классов

Пространства имен Namespace — способ группировки классов Пространства имен Namespace — способ группировки классов

Пространства имен Namespace — способ группировки классов Пространства имен Namespace — способ группировки классов

Пространства имен могут быть вложенными Пространства имен могут быть вложенными

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

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

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

Пространства имен А покороче? Пространства имен А покороче?

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

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

Ссылки (references) Ссылки (references)

Ссылки (references) Стековая память Динамическая память Ссылки (references) Стековая память Динамическая память

Ссылки (references) Стековая память Быстро выделяется Связана с текущим потоком исполнения Ограничена: 1 МБ Ссылки (references) Стековая память Быстро выделяется Связана с текущим потоком исполнения Ограничена: 1 МБ на поток Очищается при выходе из метода

Ссылки (references) Динамическая память (heap, куча) Выделяется не так быстро Связана с текущим процессом Ссылки (references) Динамическая память (heap, куча) Выделяется не так быстро Связана с текущим процессом Ограничена только физическим объемом оперативной памяти Очищается вручную (или сборщиком мусора)

Ссылки (references) Ссылки (references)

Ссылки (references) Ссылки (references)

Ссылки (references) Ссылки (references)

Ссылки (references) Ссылки (references)

Ссылка (reference) Содержит адрес объекта в managed heap Ссылка (reference) Содержит адрес объекта в managed heap

Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++)

Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++) На 32 bit архитектуре — 4 байта На 64 bit архитектуре — 8 байт

Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++) На 32 bit архитектуре — 4 байта На 64 bit архитектуре — 8 байт * Если очень хочется — то можно пользоваться указателями: см. unsafe. Применяется обычно для взаимодействия с нативными Win 32 DLL

Оператор сравнения == Оператор сравнения ==

Оператор сравнения == Оператор сравнения ==

Оператор сравнения == Сравниваются ссылки, а не объекты! Оператор сравнения == Сравниваются ссылки, а не объекты!

Оператор присваивания = Оператор присваивания =

Оператор присваивания = Оператор присваивания =

Оператор присваивания = Теперь обе ссылки указывают на один объект. Копирования полей не происходит! Оператор присваивания = Теперь обе ссылки указывают на один объект. Копирования полей не происходит!

Передача параметров в функцию Передача параметров в функцию

Передача параметров в функцию Естественно, по ссылке (никакого копирования) Передача параметров в функцию Естественно, по ссылке (никакого копирования)

Передача параметров в функцию Естественно, по ссылке (никакого копирования) Передача параметров в функцию Естественно, по ссылке (никакого копирования)

Передача параметров в функцию Естественно, по ссылке (никакого копирования) Передача параметров в функцию Естественно, по ссылке (никакого копирования)

Передача параметров в функцию А если хочется так? Передача параметров в функцию А если хочется так?

Передача параметров в функцию А если хочется так? Передача параметров в функцию А если хочется так?

Передача параметров в функцию Ключевое слово ref Передача параметров в функцию Ключевое слово ref

Передача параметров в функцию Ключевое слово ref Передача параметров в функцию Ключевое слово ref

Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения

Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения

Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения Часто применяется, когда нужно Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения Часто применяется, когда нужно вернуть и объектрезультат, и код ошибки string str = "42"; int num; bool is. Number = int. Try. Parse(str, out num);

Ключевое слово null Ключевое слово null

Ключевое слово null Ключевое слово null

Ссылки (references) Почти всё, с чем вы будете работать — это ссылки Ссылки (references) Почти всё, с чем вы будете работать — это ссылки

А как быть с простыми типами? А как быть с простыми типами?

А как быть с простыми типами? А как быть с простыми типами?

А как быть с простыми типами? А как быть с простыми типами?

А как быть с простыми типами? Есть ссылочные типы (reference types) А есть понятие А как быть с простыми типами? Есть ссылочные типы (reference types) А есть понятие «тип-значение» , value type

Value types int – это value type, «тип-значение» Value types int – это value type, «тип-значение»

Value types int – это value type, «тип-значение» Всегда создается на стеке* Value types int – это value type, «тип-значение» Всегда создается на стеке*

Value types int – это value type, «тип-значение» Всегда создается на стеке* Сравнивается по Value types int – это value type, «тип-значение» Всегда создается на стеке* Сравнивается по значению, побитово

Value types Оператор присваивания действительно присваивает Value types Оператор присваивания действительно присваивает

Value types При передаче в функцию аргумент копируется int i = 5; Increment(i); // Value types При передаче в функцию аргумент копируется int i = 5; Increment(i); // i == 5

Value types ref и out также работают int i = 5; Increment(ref i); // Value types ref и out также работают int i = 5; Increment(ref i); // i == 6

Value types Понятия null для value types нет Value types Понятия null для value types нет

Value types vs. reference types Value types: Всегда создаются на стеке Передаются в функцию Value types vs. reference types Value types: Всегда создаются на стеке Передаются в функцию по значению Присваиваются и сравниваются как интегральные типы Не могут быть равны null

Value types vs. reference types Value types: Reference types: Всегда создаются на стеке* Всегда Value types vs. reference types Value types: Reference types: Всегда создаются на стеке* Всегда создаются в куче Передаются в функцию по Передаются в функцию значению Присваиваются и сравниваются как интегральные типы Не могут быть равны null по ссылке Присваиваются и сравниваются ссылки, а не сами объекты Могут быть равны null

Value types vs. reference types Value types: Все числовые типы (int, float, double, …) Value types vs. reference types Value types: Все числовые типы (int, float, double, …) Примитивные типы (bool, char) Date. Time, Time. Span Guid Enum

Value types vs. reference types Value types: Reference types: Все числовые типы Всё остальное Value types vs. reference types Value types: Reference types: Все числовые типы Всё остальное string (NB!) (int, float, double, …) Примитивные типы (bool, char) Date. Time, Time. Span Guid Enum

Value types vs. reference types Value type — полноценный класс: методы, статические поля, наследование Value types vs. reference types Value type — полноценный класс: методы, статические поля, наследование от интерфейсов, etc. Для value types работает оператор new и можно определять конструкторы Даже несмотря на new, value type создастся на стеке!

Value types vs. reference types Что делать, если я хочу завести свой value type? Value types vs. reference types Что делать, если я хочу завести свой value type? Ключевое слово struct

Value types vs. reference types А зачем мне может понадобиться свой value type? Value types vs. reference types А зачем мне может понадобиться свой value type?

Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия памяти:

Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия памяти: sizeof(struct) = сумма всех полей sizeof(class) = сумма всех полей + 8 байт оверхеда

Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия памяти: sizeof(struct) = сумма всех полей sizeof(class) = сумма всех полей + 8 байт оверхеда Type object pointer (4 байта) Sync block (4 байта)

Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия Value types vs. reference types А зачем мне может понадобиться свой value type? Экономия памяти: sizeof(struct) = сумма всех полей sizeof(class) = сумма всех полей + 8 байт оверхеда Снижение оверхеда на выделение памяти в куче

Boxing/unboxing А может ли value type оказаться в куче? Boxing/unboxing А может ли value type оказаться в куче?

Boxing/unboxing А может ли value type оказаться в куче? Был value type — стал Boxing/unboxing А может ли value type оказаться в куче? Был value type — стал reference type?

Boxing/unboxing Boxing — создание копии value-type объекта в куче Unboxing — создание на стеке Boxing/unboxing Boxing — создание копии value-type объекта в куче Unboxing — создание на стеке value-type объекта, являющегося копией объекта из кучи

Boxing/unboxing Почему это происходит? Boxing/unboxing Почему это происходит?

Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки

Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки Аргументом служит Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки Аргументом служит object: выполняется семантика reference type

Boxing/unboxing А теперь поподробнее Boxing/unboxing А теперь поподробнее

Boxing/unboxing Чем чревато? Boxing/unboxing Чем чревато?

Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче

Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже выделена), но все равно не бесплатен: происходит копирование полей

Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже выделена), но все равно не бесплатен: происходит копирование полей Как избежать?

Boxing/unboxing: как избежать? Правильные сигнатуры методов: Boxing/unboxing: как избежать? Правильные сигнатуры методов:

Boxing/unboxing: как избежать? Типизованные коллекции Boxing/unboxing: как избежать? Типизованные коллекции

Value types vs. reference types Коронные вопросы на собеседовании! Чем отличаются value types от Value types vs. reference types Коронные вопросы на собеседовании! Чем отличаются value types от reference types? Какие value types вы знаете? String — это value type или reference type? Что такое boxing/unboxing?

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Один из лучших примеров «синтаксического сахара» в C# Getters and setters Один из лучших примеров «синтаксического сахара» в C#

Getters and setters Getters and setters

Getters and setters Геттер и сеттер вызовутся при доступе к полю Getters and setters Геттер и сеттер вызовутся при доступе к полю

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Getters and setters

Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами! Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами!

Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами! Если уж совсем лень — Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами! Если уж совсем лень — то есть простой способ:

Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами! Публичное поле без геттера или Getters and setters Настоятельная рекомендация: оборачивайте все поля геттерами/сеттерами! Публичное поле без геттера или сеттера — очень плохая практика

Getters and setters: а зачем? Getters and setters: а зачем?

Getters and setters: а зачем? Важный момент в терминологии: Поле с геттером или сеттером: Getters and setters: а зачем? Важный момент в терминологии: Поле с геттером или сеттером: property, свойство Поле без геттера и без сеттера: field, поле

Getters and setters: а зачем? Рефлексия делает различие между полями (fields) и свойствами (properties) Getters and setters: а зачем? Рефлексия делает различие между полями (fields) и свойствами (properties) Как правило, динамический доступ по имени поля возможен только до полей с геттерами/сеттерами

Getters and setters: а зачем? Getters and setters: а зачем?

Итоги за сегодня Пространства имен (namespaces) и ключевое слово static Ссылки (references) Reference types Итоги за сегодня Пространства имен (namespaces) и ключевое слово static Ссылки (references) Reference types и value types. Boxing и unboxing Геттеры и сеттеры. Поля (fields) и свойства (properties)

В следующей серии ООП в C#. Почему наследоваться от двух интерфейсов можно, а от В следующей серии ООП в C#. Почему наследоваться от двух интерфейсов можно, а от двух классов — нет, и еще одна ипостась слова new Перегрузка операторов: почему вы сталкиваетесь с ней гораздо чаще, чем вам кажется Оператор == и метод object. Equals()

C# и. NET Framework Лекция 2 C# и. NET Framework Лекция 2