SlideShare a Scribd company logo
Что может быть проще:
делегаты и события
Михаил Щербаков
Independent Consultant
Обо мне
 Консультант, Upwork’er,
 Разработчик проекта IntelliDebugger http://intelliegg.com
 Координатор сообществ .NET программистов Москвы и
Санкт-Петербурга http://mskdotnet.org/ http://spbdotnet.org
 В прошлом менеджер по продуктам и тимлид в Cezurity,
Acronis, Luxoft, Boeing
О делегатах
О делегатах
Делегат - ?...
О делегатах
Делегат - это тип, который представляет
собой ссылки на методы с определенным
списком параметров и возвращаемым
типом.
О делегатах
Делегат - это ТИП, который представляет
собой ссылкИ на методы с определенным
списком параметров и возвращаемым
типом.
О делегатах
О делегатах
.class nested public sealed auto ansi Foo extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance
void .ctor(object @object, native int @method) runtime managed {}
.method public hidebysig virtual newslot instance
string Invoke(int32 arg) runtime managed {}
.method public hidebysig virtual newslot instance class [mscorlib]System.IAsyncResult
BeginInvoke(int32 arg, class [mscorlib]System.AsyncCallback callback,
object @object) runtime managed {}
.method public hidebysig virtual newslot instance
string EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed {}
}
MulticastDelegate. Properties
MulticastDelegate. Methods
MulticastDelegate. Methods
Invoke(…), .ctor(…)
.class nested public sealed auto ansi Foo extends [mscorlib]System.MulticastDelegate
{
.method public hidebysig specialname rtspecialname instance
void .ctor(object @object, native int @method) runtime managed {}
.method public hidebysig virtual newslot instance
string Invoke(int32 arg) runtime managed {}
.method public hidebysig virtual newslot instance class [mscorlib]System.IAsyncResult
BeginInvoke(int32 arg, class [mscorlib]System.AsyncCallback callback,
object @object) runtime managed {}
.method public hidebysig virtual newslot instance
string EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed {}
}
О проблемах
особенностях реализации
делегатов
О проблемах делегатов
О проблемах делегатов
О проблемах делегатов
О проблемах делегатов
О проблемах делегатов
О проблемах делегатов
О проблемах делегатов. Exceptions
О проблемах делегатов
Блог Александра Шведова
 http://controlflow.github.io/2011/11/14/delegate-equality-
proxy.html
 http://controlflow.github.io/2011/10/24/delegate-equality-
valuetype.html
 http://controlflow.github.io/2011/10/24/delegate-equality-
base.html
О событиях
О событиях
События это член, который позволяет
классу или объекту получать уведомления.
https://msdn.microsoft.com/en-us/library/aa664454(v=vs.71)
О событиях
О событиях
Auto-Implemented Properties
WTF?!!
Field-like Events. C# 3
Field-like Events. C# 4
Field-like Events. Synchronization
Field-like Events. Synchronization
Raise Event
Raise Event
Raise Event
Raise Event
Custom Event Accessors
https://msdn.microsoft.com/en-us/library/8843a9ch.aspx
О проблемах событий
Virtual Events
1) Use a virtual method for triggering the event.
2) If you need to override virtual events, write your own handlers.
https://blogs.msdn.microsoft.com/samng/2007/11/26/virtual-events-in-c/
No-op Events
Memory Leak
Source delegate Listener
Memory Leak. Listener-side Fix
Source delegate ListenerWrapper
Memory Leak. Listener-side Fix
Use
 WeakEventManager
 PropertyChangedEventManager
 …
 WeakEventManager<TEventSource, TEventArgs>
Memory Leak. Listener-side Fix
Memory Leak. Source-side Fix
Source
Listener
Wrapper
Wrapper MethodInfo
MethodInfo
Listenerhttp://www.codeproject.com/Articles/29922/Weak-Events-in-C
Порефлексируем…
Observer Pattern
Observer Pattern
Reactive Extensions
Спасибо за внимание!
Михаил Щербаков
yuske.dev@gmail.com
spbdotnet.org
github.com/yuske
@yu5k3
Independent Consultant

More Related Content

Similar to Delegates and events in C#

C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
Igor Shkulipa
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
Technopark
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
Denis Tsvettsih
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
Alexander Byndyu
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
Fwdays
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
Technopark
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
Roman Dvornov
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
Dmytro Chyzhykov
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
DevGAMM Conference
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Denis Tsvettsih
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
CUSTIS
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 

Similar to Delegates and events in C# (20)

C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Genome
GenomeGenome
Genome
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Bytecode
BytecodeBytecode
Bytecode
 

More from Mikhail Shcherbakov

Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
Mikhail Shcherbakov
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
Mikhail Shcherbakov
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
Mikhail Shcherbakov
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
Mikhail Shcherbakov
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
Mikhail Shcherbakov
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
Mikhail Shcherbakov
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
Mikhail Shcherbakov
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
 
Project Rider
Project RiderProject Rider
Project Rider
Mikhail Shcherbakov
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
Mikhail Shcherbakov
 
Structured logging
Structured loggingStructured logging
Structured logging
Mikhail Shcherbakov
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
Mikhail Shcherbakov
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
Mikhail Shcherbakov
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Mikhail Shcherbakov
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
Mikhail Shcherbakov
 

More from Mikhail Shcherbakov (20)

Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Project Rider
Project RiderProject Rider
Project Rider
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Structured logging
Structured loggingStructured logging
Structured logging
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Как это работает: DLR
Как это работает: DLRКак это работает: DLR
Как это работает: DLR
 

Delegates and events in C#

Editor's Notes

  1. Это экспериментальный доклад-обсуждение языковой фичи, которая есть с первых версий C#. Казалось бы что тут может быть нового??? Сколько здесь С++ dev’ов? Сколько только C#?
  2. Методы не меняют состояние делегата, объект делегата – immutable
  3. Delegate.Invoke и .ctor Показать IL код и снять дамп кода WinDbg'ом
  4. Наличие стандартных делегатов Func<> и Action<> и синтексиса для их создания из лябмд. Показать IL код
  5. Foo.Bar()
  6. Блог Александра Шведова, разработчика R#
  7. На собеседованиях часто спрашивают в чем отличие событий от делегатов?  Это все равно что спросить в чем отличие метода GetHashCode() от типа int?
  8. Событие - это не экземпляр делегата ЧТО ЭТО НАПОМИНАЕТ? Auto-Implemented Properties
  9. In C# 3 Плохо все: - использует Monitor - на публичном объекте - не работает в структурах
  10. https://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/ Оптимизация введение дополнительного чтения (read introduction) https://msdn.microsoft.com/ru-ru/magazine/jj883956.aspx http://www.codeproject.com/Articles/37474/Threadsafe-Events.aspx
  11. Race condition, performance issue Проблема с бОльшим выделением памяти актуально если у нас много event’ом
  12. Не проверял в последних версиях
  13. Не проверял в последних версиях https://blogs.msdn.microsoft.com/cburrows/2010/03/30/events-get-a-little-overhaul-in-c-4-afterward-effective-events/