25/10/2013 C# lect2.ppt
- Количество слайдов: 106
C# и. NET Framework Лекция 2
Автор материала: Семён Факторович, НГУ оф. сайт курса: http: //bit. ly/nsudotnet
Сегодня в программе Немного о ключевом слове static и пространствах имен (namespaces) Ссылки (references): куда подевались мои указатели? Reference types и value types (очень важный момент) Fields vs. properties, или кто такие геттеры и сеттеры?
Ключевое слово static
Ключевое слово static Вместо глобальных переменных — статические поля
Ключевое слово static Вместо глобальных переменных — статические поля
Ключевое слово static Вместо глобальных функций — статические методы классов
Ключевое слово static Вместо глобальных функций — статические методы классов
Пространства имен Namespace — способ группировки классов
Пространства имен Namespace — способ группировки классов
Пространства имен могут быть вложенными
Пространства имен
Пространства имен
Пространства имен
Пространства имен А покороче?
Пространства имен
Пространства имен
Ссылки (references)
Ссылки (references) Стековая память Динамическая память
Ссылки (references) Стековая память Быстро выделяется Связана с текущим потоком исполнения Ограничена: 1 МБ на поток Очищается при выходе из метода
Ссылки (references) Динамическая память (heap, куча) Выделяется не так быстро Связана с текущим процессом Ограничена только физическим объемом оперативной памяти Очищается вручную (или сборщиком мусора)
Ссылки (references)
Ссылки (references)
Ссылки (references)
Ссылки (references)
Ссылка (reference) Содержит адрес объекта в managed heap
Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++)
Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++) На 32 bit архитектуре — 4 байта На 64 bit архитектуре — 8 байт
Ссылка (reference) Содержит адрес объекта в managed heap Единственный* способ доступа к объектам (нет разделения «указатель/ссылка» , как в C++) На 32 bit архитектуре — 4 байта На 64 bit архитектуре — 8 байт * Если очень хочется — то можно пользоваться указателями: см. unsafe. Применяется обычно для взаимодействия с нативными Win 32 DLL
Оператор сравнения ==
Оператор сравнения ==
Оператор сравнения == Сравниваются ссылки, а не объекты!
Оператор присваивания =
Оператор присваивания =
Оператор присваивания = Теперь обе ссылки указывают на один объект. Копирования полей не происходит!
Передача параметров в функцию
Передача параметров в функцию Естественно, по ссылке (никакого копирования)
Передача параметров в функцию Естественно, по ссылке (никакого копирования)
Передача параметров в функцию Естественно, по ссылке (никакого копирования)
Передача параметров в функцию А если хочется так?
Передача параметров в функцию А если хочется так?
Передача параметров в функцию Ключевое слово ref
Передача параметров в функцию Ключевое слово ref
Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения
Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения
Передача параметров в функцию Вариант поинтереснее: out, обязательное присвоение значения Часто применяется, когда нужно вернуть и объектрезультат, и код ошибки string str = "42"; int num; bool is. Number = int. Try. Parse(str, out num);
Ключевое слово null
Ключевое слово null
Ссылки (references) Почти всё, с чем вы будете работать — это ссылки
А как быть с простыми типами?
А как быть с простыми типами?
А как быть с простыми типами?
А как быть с простыми типами? Есть ссылочные типы (reference types) А есть понятие «тип-значение» , value type
Value types int – это value type, «тип-значение»
Value types int – это value type, «тип-значение» Всегда создается на стеке*
Value types int – это value type, «тип-значение» Всегда создается на стеке* Сравнивается по значению, побитово
Value types Оператор присваивания действительно присваивает
Value types При передаче в функцию аргумент копируется int i = 5; Increment(i); // i == 5
Value types ref и out также работают int i = 5; Increment(ref i); // i == 6
Value types Понятия null для value types нет
Value types vs. reference types Value types: Всегда создаются на стеке Передаются в функцию по значению Присваиваются и сравниваются как интегральные типы Не могут быть равны null
Value types vs. reference types Value types: Reference types: Всегда создаются на стеке* Всегда создаются в куче Передаются в функцию по Передаются в функцию значению Присваиваются и сравниваются как интегральные типы Не могут быть равны null по ссылке Присваиваются и сравниваются ссылки, а не сами объекты Могут быть равны null
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: Все числовые типы Всё остальное string (NB!) (int, float, double, …) Примитивные типы (bool, char) Date. Time, Time. Span Guid Enum
Value types vs. reference types Value type — полноценный класс: методы, статические поля, наследование от интерфейсов, etc. Для value types работает оператор new и можно определять конструкторы Даже несмотря на new, 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? Экономия памяти: sizeof(struct) = сумма всех полей sizeof(class) = сумма всех полей + 8 байт оверхеда
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? Экономия памяти: sizeof(struct) = сумма всех полей sizeof(class) = сумма всех полей + 8 байт оверхеда Снижение оверхеда на выделение памяти в куче
Boxing/unboxing А может ли value type оказаться в куче?
Boxing/unboxing А может ли value type оказаться в куче? Был value type — стал reference type?
Boxing/unboxing Boxing — создание копии value-type объекта в куче Unboxing — создание на стеке value-type объекта, являющегося копией объекта из кучи
Boxing/unboxing Почему это происходит?
Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки
Boxing/unboxing Почему это происходит? Список не содержит копии объектов, а только ссылки Аргументом служит object: выполняется семантика reference type
Boxing/unboxing А теперь поподробнее
Boxing/unboxing Чем чревато?
Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче
Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже выделена), но все равно не бесплатен: происходит копирование полей
Boxing/unboxing Чем чревато? Boxing дорог: выделение памяти в куче Unboxing дешевле (стековая память уже выделена), но все равно не бесплатен: происходит копирование полей Как избежать?
Boxing/unboxing: как избежать? Правильные сигнатуры методов:
Boxing/unboxing: как избежать? Типизованные коллекции
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 Один из лучших примеров «синтаксического сахара» в 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: а зачем? Важный момент в терминологии: Поле с геттером или сеттером: property, свойство Поле без геттера и без сеттера: field, поле
Getters and setters: а зачем? Рефлексия делает различие между полями (fields) и свойствами (properties) Как правило, динамический доступ по имени поля возможен только до полей с геттерами/сеттерами
Getters and setters: а зачем?
Итоги за сегодня Пространства имен (namespaces) и ключевое слово static Ссылки (references) Reference types и value types. Boxing и unboxing Геттеры и сеттеры. Поля (fields) и свойства (properties)
В следующей серии ООП в C#. Почему наследоваться от двух интерфейсов можно, а от двух классов — нет, и еще одна ипостась слова new Перегрузка операторов: почему вы сталкиваетесь с ней гораздо чаще, чем вам кажется Оператор == и метод object. Equals()
C# и. NET Framework Лекция 2