{"id":374315,"date":"2024-05-21T05:57:18","date_gmt":"2024-05-21T05:57:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=374315"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=374315","title":{"rendered":"<span>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0432 .NET: \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b, \u0438 \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u0443\u0442 \u0441\u0430\u0445\u0430\u0440<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u041f\u041e \u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0441\u0430\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 .NET \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<h3>\u041e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043d\u0430 \u0441\u0430\u0445\u0430\u0440\u0435<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043d\u043d\u044b\u043c \u0441\u0430\u0445\u0430\u0440\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0443\u043a\u0430\u0445 \u0431\u044b\u043b\u0430 \u0441\u0430\u0445\u0430\u0440\u043d\u0438\u0446\u0430, \u0438 \u043c\u044b \u0441\u0430\u0445\u0430\u0440 \u0438\u0437 \u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u043b\u0438 \u2013 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u043b\u0441\u044f \u0441\u0430\u0445\u0430\u0440? \u0418\u0434\u0442\u0438 \u0437\u0430 \u0432\u0435\u043d\u0438\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u042d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u00ab\u0441\u0438\u0434\u0438\u0442 \u0443 \u043d\u0430\u0441 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\u00bb. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u0430\u0445\u0430\u0440 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043b\u0438, \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0435\u043d\u0438\u043a\u043e\u043c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/621\/ab2\/946\/621ab29465b5e91075ed321b9fb239eb.png\" width=\"1475\" height=\"823\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/621\/ab2\/946\/621ab29465b5e91075ed321b9fb239eb.png\"\/><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c \u043f\u044b\u043b\u0435\u0441\u043e\u0441 \u2013 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u043d\u0435 \u0437\u0430 \u0432\u0435\u043d\u0438\u043a\u043e\u043c, \u0430 \u0437\u0430 \u043f\u044b\u043b\u0435\u0441\u043e\u0441\u043e\u043c (\u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438, \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438). \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043e\u0432\u0441\u0435 \u2013 \u0442\u043e\u0433\u0434\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u0430\u0445\u0430\u0440\u0443.<\/p>\n<h3>\u041e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0432 C#<\/h3>\n<p>\u0412 C# \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Web Forms, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"cs\">MyButton.Click += new EventHandler(this.MyBtn_Click);<\/code><\/pre>\n<p><code>\u0421lick<\/code> \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441 Button, \u0430 <code>MyBtn_Click<\/code> \u2013 \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0436\u0435, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c. \u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438?<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c: \u0442\u0430\u043a\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435\u0442. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u043c, \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0430 \u043c\u043e\u0436\u0435\u043c \u0438 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438 \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0443 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430\u0445.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u2013 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443. \u041f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0435\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p><strong>\u0412 C# \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0447\u043b\u0435\u043d\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c event. \u041d\u0430\u0440\u044f\u0434\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438<\/strong>.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cs\">event \u0442\u0438\u043f_\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f;<\/code><\/pre>\n<ul>\n<li>\n<p>\u0442\u0438\u043f_\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 (\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 += :<\/p>\n<pre><code class=\"cs\">\u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f += \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a_\u0441\u043e\u0431\u044b\u0442\u0438\u044f;<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c, \u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 .Net 7.0, C# 11. <\/p>\n<pre><code class=\"cs\">class Program {     static void Main()     {         EmailService emailService = new EmailService(emailFrom: \"hr@disney.com\");          \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f         emailService.MailSent += LogToConsole;          emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");     }      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToConsole(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\"); }  \/\/ \u041a\u043b\u0430\u0441\u0441 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 class EmailService {     private readonly string _emailFrom;      public EmailService(string emailFrom)     {         _emailFrom = emailFrom;     }      \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435     public event MailSentEventHandler? MailSent;      public void SendMail(string emailTo, string subject, string body)     {         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0441\u044c\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e...         \/\/ Send(_emailFrom, emailTo, subject, body);          \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f         var eventArgs = new MailSentEventArgs         {             EmailFrom = _emailFrom,             EmailTo = emailTo,             Subject = subject,             Body = body         };         OnMailSent(eventArgs);     }      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f     protected virtual void OnMailSent(MailSentEventArgs eventArgs)     {         MailSentEventHandler? mailSentHandler = MailSent;         if (mailSentHandler != null)         {             mailSentHandler(eventArgs);         }     } }  \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f public delegate void MailSentEventHandler(MailSentEventArgs eventArgs);  public record MailSentEventArgs {     public string? EmailFrom { get; init; }     public string? EmailTo { get; init; }     public string? Subject { get; init; }     public string? Body { get; init; } } <\/code><\/pre>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>MailSent<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441 <code>EmailService<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>LogToConsole<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043b\u043e\u0433\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430.\u00a0<\/p>\n<p>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Delegate.Combine<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435.<\/p>\n<pre><code class=\"cs\">static void Main()     {         EmailService emailService = new EmailService(emailFrom: \"hr@disney.com\");          \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f         emailService.MailSent += LogToConsole;         emailService.MailSent += LogToFile;          emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");          emailService.MailSent -= LogToFile;         emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");     }      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToConsole(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\");      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToFile(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\"); <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>add\/remove<\/code> \u0443 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<pre><code class=\"cs\">private MailSentEventHandler? mailSent; public event MailSentEventHandler MailSent { add { mailSent += value; Console.WriteLine($\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a {value.Method.Name} \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\"); } remove { Console.WriteLine($\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a {value.Method.Name} \u0443\u0434\u0430\u043b\u0435\u043d\"); mailSent -= value; } } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToConsole \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToFile \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToFile \u0443\u0434\u0430\u043b\u0435\u043d [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day.. <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u2013 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>try catch<\/code> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435.<\/p>\n<pre><code class=\"cs\">static void LogToConsole(MailSentEventArgs eventArgs) { try { throw new Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438\"); } catch (Exception e) { Console.WriteLine(e); } }<\/code><\/pre>\n<h3>EventHandler<\/h3>\n<p>\u0412 .NET \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 EventHandler, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0438\u043f\u0430 System.EventArgs. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043c\u044f \u0442\u0438\u043f\u0430 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e\u043c EventArgs.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 .NET Framework 4.5 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442 System.EventArgs \u0441\u0442\u0430\u043b\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">public class MailSentEventArgs : EventArgs { public string? EmailFrom { get; init; } public string? EmailTo { get; init; } public string? Subject { get; init; } public string? Body { get; init; } }<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u043a\u0430\u043a<\/p>\n<pre><code class=\"cs\">public event EventHandler&lt;MailSentEventArgs>? MailSent;<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong>object sender<\/strong> \u0438 <strong>MailSentEventArgs args<\/strong>. \u0413\u0434\u0435 <code>sender<\/code> \u2013 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d event, a <code>args<\/code> \u2013 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u043d\u0435\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0438\u043f\u0430 <code>object<\/code>, \u0430 \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u043e \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">public static void LogToConsole(object? sender, MailSentEventArgs args)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{args.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{args.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{args.EmailTo}': {args.Body}\");        public static void LogToFile(object? sender, MailSentEventArgs args)         => Console.WriteLine(             $\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{args.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{args.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{args.EmailTo}': {args.Body}\")<\/code><\/pre>\n<p>\u0410 \u0432\u044b\u0437\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">MailSent?.Invoke(this, eventArgs);<\/code><\/pre>\n<p>\u041f\u043e\u0440\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043f\u043e\u0440\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u0442\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0412 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f EventArgs.Empty.\u00a0 \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"cs\">public event EventHandler? MailSent;<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c <code>object sender<\/code> \u0438 <code>EventArgs<\/code>:<\/p>\n<pre><code class=\"cs\">static void LogToConsole(object? sender, EventArgs eventArgs) => Console.WriteLine(\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u0438\u0441\u044c\u043c\u043e\");<\/code><\/pre>\n<p>\u0430 \u0432\u044b\u0437\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">MailSent?.Invoke(this, EventArgs.Empty);<\/code><\/pre>\n<h3>AsyncEventHandler<\/h3>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439. \u0421 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 <code>Microsoft.VisualStudio.Threading<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">public event AsyncEventHandler&lt;MailSentEventArgs>? MailSent;<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">static Task LogToConsoleAsync(object? sender, MailSentEventArgs args) { Console.WriteLine( $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{args.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{args.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{args.EmailTo}': {args.Body}\"); return Task.CompletedTask; }<\/code><\/pre>\n<p>\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">await MailSent?.InvokeAsync(this, new MailSentEventArgs());<\/code><\/pre>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c<\/h3>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 IL-\u043a\u043e\u0434e. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 add \u0438 remove: \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 += \u0438 \u2013=.\u00a0\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u0448 \u043a\u043e\u0434. \u0422\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u041f\u0440\u043e\u0433\u043d\u0430\u0432 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 <a href=\"https:\/\/sharplab.io\/#v2:CYLg1APgAgTABFAjAdgLACgDeG64YgNgQBY4BZAQwEsA7ACgEoc9t0924BRAW2oBsAygFMATgDcqAYyFwhvKoNETpcALxwaQgO5d5i8VKF05\/AGIiA9txBwARAAsRUKMCoBnTQE8AdJKu2GAG4MZg44AHpwuEAUEEA+EEBGEEAGEEAmEEBuEEB5EEBWEEAeEDgEwAEQRPjYwCEQQHEQQA4QQC4QOEBBEATAaRASivTQjhMFYQNpb0pOoRoAFzgwdQAZCwBzABULAGELGjcLPiFg9Db2Dv1lIW9hGmA+vmM9WZtbMgULXoBXEQAHe09nVw8hHz9uWwAaODdbgAjABWQkkgwuAHUhHwvjJBhY4AARdxeX5wQEWYCeC6zYAUTxwdxwTwWe5wABmVBEbmG+J83m8AXW7AAviE2HhInBAHgg8UKxXK1T+VVKsXyDUAnCBwVKxQDMIBV8oBhEEyJTgyTgosAvCD1VKAGRA8iVAPwghTSmS1WtimTqsQSgEkQc0VTJtJBEKCkCYzeaLZarOjHA6DThiAaDACCIkmblkIaGEajTE5uFYYVwUGQLLw7PQ2Yw3MAWCCpRK1WrqzVi\/KxXL5TKJVIVQDsILFkolLTb4k0nRhYLp+F1dhgU3gHiIqGIKIMZCIhBRgIs+ISkAAGOAAfW25is6xdAGZe\/1ukZl7I9JvuIn2EOwuvT5ZuGoT2Y75ncLmkxEonzAFIg6TSWVy9Qds0zrvlAe5CLGwwBqGwahgAEhQhyrCIAD85B9qG26gXu7pwAcRz8HQx7bLMfzHgCIJgoMZGICumLYheLCbFyn7GqaGQ5HARoVLUerZLEXGxPqTYtiUmSpIAciCMt4zG4Ny+F0DeT5WH8JEWH8FGguCfzcEIbhuBQkxCEEHKph+cCAEggDQNg0LacdkqqxIALCBwA2iRGkqtRVIk7adq077sOOIgxqG8bRuomg6NBQywXGkZuLJcBXmZ+58GeD5KQoZ4\/Il7A8PwswPmpOUBamAhAlpwzqJpVElSleAAEJYoS6j0Z4iWsi+HAAPI0NFgzGJBYUme+b7sNygAYILURpCXqDYqrkDklM5cBORkrnuZ53m+c0\/nsCOFiTuCQjAHAEgiIMtwUHwJBwL1\/X+hhMVDfFIVxQmbTJew\/WxYMCFIaIaF6IG\/3AMhD79V17BUBScB0MD8GIWDohwAAhBFtx8HwjFhF9qYI0MoPIYNoXxSNZnZmyGBvty36\/hxuTNEaO0tN2e7ADCQiTBOMi4T9kFE6Ij39M9pNRm94Zk1hYFwNOfgiKd\/NiwlWC7vgK75Vld5JXARmDIERI0FQ+twGNeAy8emt8IVmC60IJu0MbBtm2mOG0XhFVUTresG47Jsuwgbsrk12Le\/bvtG\/71NAA\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432 \u043c\u0435\u0441\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<pre><code class=\"cs\">public event MailSentEventHandler MailSent {     [NullableContext(2)]     [CompilerGenerated]     add     {         MailSentEventHandler mailSentEventHandler = this.MailSent;         while (true)         {             \/\/ \u0431\u0435\u0440\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442             MailSentEventHandler mailSentEventHandler2 = mailSentEventHandler;              \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0443 \u043d\u043e\u0432\u044b\u0439             MailSentEventHandler value2 = (MailSentEventHandler)Delegate                                          .Combine(mailSentEventHandler2, value);              \/\/ \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c MailSent \u0438 mailSentEventHandler2             \/\/ \u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c MailSent \u043d\u0430 value2             \/\/ \u0430 \u0432 mailSentEventHandler \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 MailSent             mailSentEventHandler = Interlocked              .CompareExchange(ref this.MailSent, value2, mailSentEventHandler2);              \/\/ \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e - \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c             \/\/ \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b - \u0435\u0441\u043b\u0438 \u0432             \/\/ \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432,             \/\/ \u0442\u043e while \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u043a \u0443\u0436\u0435            \/\/ \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432             if ((object)mailSentEventHandler == mailSentEventHandler2)             {                 break;             }         }     }     [NullableContext(2)]     [CompilerGenerated]     remove     {         MailSentEventHandler mailSentEventHandler = this.MailSent;         while (true)         {             \/\/ \u0431\u0435\u0440\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442             MailSentEventHandler mailSentEventHandler2 = mailSentEventHandler;              \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e value             MailSentEventHandler value2 = (MailSentEventHandler)Delegate                                           .Remove(mailSentEventHandler2, value);              \/\/ \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c MailSent \u0438 mailSentEventHandler2             \/\/ \u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c MailSent \u043d\u0430 value2             \/\/ \u0430 \u0432 mailSentEventHandler \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 MailSent                         mailSentEventHandler = Interlocked              .CompareExchange(ref this.MailSent, value2, mailSentEventHandler2);              \/\/ \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e - \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c             if ((object)mailSentEventHandler == mailSentEventHandler2)             {                 break;             }         }     } }<\/code><\/pre>\n<h2>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb, \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439. \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0441\u0430\u0445\u0430\u0440\u043e\u043c, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441\u0430\u0445\u0430\u0440\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u043b \u0441\u0430\u0445\u0430\u0440 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u2013 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u043c. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e (\u043a\u0442\u043e-\u0442\u043e \u0441 \u0432\u0435\u043d\u0438\u043a\u043e\u043c, \u0430 \u043a\u0442\u043e-\u0442\u043e \u0441 \u043f\u044b\u043b\u0435\u0441\u043e\u0441\u043e\u043c). \u0414\u0430\u043b\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u0445\u0430\u0440, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0434\u0438\u043d \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043b\u0435\u0434\u043e\u043c \u2013 \u0441\u0432\u043e\u0438.<\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430, \u0430 \u043c\u043e\u0436\u043d\u043e \u2013 \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439\u0441\u044f \u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<pre><code class=\"cs\">class Program {     static void Main()     {         EmailService emailService = new EmailService(\"hr@disney.com\");          \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f         var consoleObserver = new ConsoleObserver(emailService);         var fileObserver = new FileObserver(emailService);          emailService.SendMail(             emailTo: \"Milo.Murphy@disney.com\",             subject: \"Welcome to Disney\",             body: \"Today is your first day...\");          fileObserver.StopObserve();          emailService.SendMail(             emailTo: \"Milo.Murphy@disney.com\",             subject: \"Welcome to Disney\",             body: \"Today is your first day...\");     } }  interface IObserver {     void Update(string emailFrom, string emailTo, string subject, string body); }  interface IObservable {     void RegisterObserver(IObserver o);     void RemoveObserver(IObserver o); }  class EmailService : IObservable {     private readonly List&lt;IObserver> _observers;     private readonly string _emailFrom;      public EmailService(string emailFrom)     {         _emailFrom = emailFrom;         _observers = new List&lt;IObserver>();     }      public void RegisterObserver(IObserver o)     {         _observers.Add(o);     }      public void RemoveObserver(IObserver o)     {         _observers.Remove(o);     }      protected void MailSent(string emailTo, string subject, string body)     {         foreach (IObserver o in _observers)         {             o.Update(_emailFrom, emailTo, subject, body);         }     }      public void SendMail(string emailTo, string subject, string body)     {         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e         \/\/Send(_emailFrom, emailTo, subject, body);          \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439         MailSent(emailTo, subject, body);     } }  class ConsoleObserver : IObserver {     IObservable? _stock;     public ConsoleObserver(IObservable obs)     {         _stock = obs;         _stock.RegisterObserver(this);     }     public void Update(         string emailFrom,         string emailTo,         string subject,         string body)     {         Console.WriteLine($\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{emailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{emailTo}': {body}\");     }      public void StopObserve()     {         if (_stock is null)         {             return;         }         _stock.RemoveObserver(this);         _stock = null;     } }  class FileObserver : IObserver {     IObservable? _stock;     public FileObserver(IObservable obs)     {         _stock = obs;         _stock.RegisterObserver(this);     }      public void Update(         string emailFrom,         string emailTo,         string subject,         string body)     {         Console.WriteLine($\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{emailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{emailTo}': {body}\");     }      public void StopObserve()     {         if (_stock is null)         {             return;         }         _stock.RemoveObserver(this);         _stock = null;     } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<h3>\u041c\u0438\u043d\u0443\u0441\u044b \u0438 \u043f\u043b\u044e\u0441\u044b \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb<\/h3>\n<h4>\u041c\u0438\u043d\u0443\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u0438\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0430 \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043f\u043e\u0440\u043e\u0433 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u2013 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u043c\u0435\u0442\u043e\u0434 IObserver.Update (\u043b\u0438\u0431\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f object, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u044c);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u0434 \u0441\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c \u2013 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c \u2013 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 (\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u044d\u043a\u0441\u0435\u043f\u0448\u0435\u043d \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432).<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043b\u044e\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445, \u0433\u0434\u0435 \u043d\u0435\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u2013 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0421++;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u044d\u043a\u0441\u0435\u043f\u0448\u043d \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b: \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434 \u043d\u0443\u0436\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0430 \u043d\u0435 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u0438\u0434\u0430 &#171;<code>object sender<\/code>, EventArgs e&#187;.<\/p>\n<\/li>\n<\/ul>\n<h2>MediatR<\/h2>\n<p>\u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <a href=\"https:\/\/www.nuget.org\/packages\/MediatR\/\"><u>MediatR<\/u><\/a> \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u042d\u0442\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 C# \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e.<\/p>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, MediatR \u2013 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u00ab\u041f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u00bb. \u0421\u0443\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u2013 \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.\u00a0<\/p>\n<p>\u00ab\u041f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u00bb \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442 \u044f\u0432\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0435\u0439. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443 \u0442\u0438\u043f\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IRequest<\/code>\u00a0 \u0438\u043b\u0438 <code>INotification<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0442\u0438\u043f\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0422\u043e\u0433\u0434\u0430 MediatR \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>Send<\/code> \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>IRequest<\/code> \u0438 <code>Publish<\/code> \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>INotification<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 MediatR \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <code>IRequest<\/code> \u0438 <code>IRequestHandler<\/code>. \u0422\u0438\u043f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u043e\u0440\u043e\u043c, \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>IRequest&lt;TResponse><\/code>, \u0433\u0434\u0435 <code>TResponse<\/code> \u2013 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IRequestHandler&lt;TRequest<\/code>, <code>TResponse><\/code>, \u0433\u0434\u0435 <code>TRequest<\/code> \u2013 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0442\u0438\u043f \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>IRequest<\/code>. \u041d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 MediatR \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>INotification<\/code>. \u0418, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>INotificationHandler&lt;TRequest><\/code>.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c nuget-\u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.nuget.org\/packages\/MediatR\/\"><u>MediatR<\/u><\/a> \u0438 nuget-\u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Extensions.DependencyInjection\/\"><u>Microsoft.Extensions.DependencyInjection<\/u><\/a>):<\/p>\n<pre><code class=\"cs\">using System.Reflection; using MediatR; using Microsoft.Extensions.DependencyInjection;  class Program {     static async Task Main()     {         var serviceCollection = new ServiceCollection()             .AddMediatR(cfg =>          cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()))             .BuildServiceProvider();          var mediator = serviceCollection.GetRequiredService&lt;IMediator>();         EmailService emailService = new EmailService(mediator, \"hr@disney.com\");          await emailService.SendMailToUserAsync(             emailTo: \"Milo.Murphy@disney.com\",             subject: \"Welcome to Disney\",             body: \"Today is your first day...\");     } }  class MailSentRequest : INotification {     public string? EmailFrom { get; init; }     public string? EmailTo { get; init; }     public string? Subject { get; init; }     public string? Body { get; init; } }  class ConsoleHandler : INotificationHandler&lt;MailSentRequest> {     public Task Handle(         MailSentRequest request,         CancellationToken cancellationToken) { Console.WriteLine( $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{request.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{request.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{request.EmailTo}': {request.Body}\"); return Task.CompletedTask; } }  class FileHandler : INotificationHandler&lt;MailSentRequest> {     public Task Handle(         MailSentRequest request,         CancellationToken cancellationToken) { Console.WriteLine( $\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{request.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{request.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{request.EmailTo}': {request.Body}\"); return Task.CompletedTask; } }  class EmailService {     private readonly string _emailFrom;     private readonly IMediator _mediator;      public EmailService(IMediator mediator, string emailFrom)     {         _mediator = mediator;         _emailFrom = emailFrom;     }      public async Task SendMailToUserAsync(         string emailTo,         string subject,         string body)     {         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e         \/\/Send(_emailFrom, emailTo, subject, body);         \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f         await MailSentAsync(_emailFrom, emailTo, subject, body);     }      protected async Task MailSentAsync(string emailFrom, string emailTo, string subject, string body)     {         var request = new MailSentRequest         {             EmailFrom = emailFrom,             EmailTo = emailTo,             Subject = subject,             Body = body         };         await _mediator.Publish(request);     } } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<h3>\u041f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f MediatR:<\/h3>\n<h4>\u041f\u043b\u044e\u0441<\/h4>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 MediatR \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u044e\u0441\u043e\u043c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041c\u0438\u043d\u0443\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u043a\u043b\u0430\u0441\u0441\u044b \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u043e\u0432 \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 (\u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0432\u0435\u0441\u0438\u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 [<code>UsedImplicitly]<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u043b\u044c\u0437\u044f \u00ab\u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443\u00bb \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0434\u0438\u0430\u0442\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u043e) \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0442\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043e\u0439\u0442\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d partial-\u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"cs\">public partial class MailSent {   public class Request : INotification   { public string? EmailFrom { get; init; } public string? EmailTo { get; init; } public string? Subject { get; init; } public string? Body { get; init; }   } }  public partial class MailSent {   public class ConsoleHandler : INotificationHandler&lt;Request>   {     public Task Handle( Request request, CancellationToken cancellationToken) { Console.WriteLine( $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{request.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{request.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{request.EmailTo}': {request.Body}\"); return Task.CompletedTask; }   } }  public partial class MailSent {   public class FileHandler : INotificationHandler&lt;Request>   {     public Task Handle( Request request, CancellationToken cancellationToken) { Console.WriteLine( $\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{request.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{request.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{request.EmailTo}': {request.Body}\"); return Task.CompletedTask; }   } } <\/code><\/pre>\n<p>\u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0430 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cs\">protected async Task MailSentAsync( string emailFrom, string emailTo, string subject, string body) { var request = new MailSent.Request { EmailFrom = emailFrom, EmailTo = emailTo, Subject = subject, Body = body }; await _mediator.Publish(request); }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u00ab\u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443\u00bb \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <code>MailSent<\/code> \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d \u0432\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0438\u043b\u0438 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u00a0\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0412 MediatR \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 (pipeline behavior). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IPipelineBehavior&lt;TRequest, TResponse><\/code>.<\/p>\n<pre><code class=\"cs\">services.AddScoped(typeof(IPipelineBehavior&lt;,>), typeof(MailSentBehavior&lt;,>));     class MailSentBehavior&lt;TRequest, TResponse>      : IPipelineBehavior&lt;TRequest, TResponse>  {       public async Task&lt;TResponse> Handle(             TRequest request,             RequestHandlerDelegate&lt;TResponse> next,             CancellationToken cancellationToken)       {             try             {                   Console.WriteLine($\"\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c {typeof(TRequest).Name}\");                   return await next();             }             finally             {                   Console.WriteLine($\"\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 {typeof(TRequest).Name}\");             }     }   }<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 Handle \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 <code>IRequestHandler<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>PipelineBehavior<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0 <code>IRequest<\/code> \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0434\u043b\u044f <code>INotification<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>NotificationPublisher<\/code>.<\/p>\n<pre><code class=\"cs\">class Program {     static async Task Main()     {         var serviceCollection = new ServiceCollection()             .AddMediatR(config =>         {            config.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());            config.NotificationPublisher = new MailSentPublisher();            config.NotificationPublisherType = typeof(MailSentPublisher);         })             .BuildServiceProvider();          var mediator = serviceCollection.GetRequiredService&lt;IMediator>();         EmailService emailService =                 new EmailService(mediator: mediator, emailFrom: \"hr@disney.com\");          await emailService.SendMailToUserAsync( emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");     } }  class MailSentPublisher : INotificationPublisher {     public async Task Publish( IEnumerable&lt;NotificationHandlerExecutor> handlerExecutors, INotification notification, CancellationToken cancellationToken)     {         foreach (var handler in handlerExecutors)         {             try             {                 Console.WriteLine( $\"\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c {handler.HandlerInstance.GetType().Name}\");                 await handler.HandlerCallback(notification, cancellationToken) .ConfigureAwait(false);             }             catch (Exception e)             {                 Console.WriteLine($\"\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 {e.Message}\");             }             finally             {                 Console.WriteLine( $\"\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 {handler.HandlerInstance.GetType().Name}\");             }         }     } } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c ConsoleHandler [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ConsoleHandler \u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c FileHandler [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 FileHandler<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0435\u043a\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 \u0435\u0449\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<h2>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0421\u043e\u0431\u044b\u0442\u0438\u0439: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 C#, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 MediatR \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c. \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u043e\u0431 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/809467\/\"> https:\/\/habr.com\/ru\/articles\/809467\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u041f\u041e \u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0441\u0430\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 .NET \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<h3>\u041e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043d\u0430 \u0441\u0430\u0445\u0430\u0440\u0435<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043d\u043d\u044b\u043c \u0441\u0430\u0445\u0430\u0440\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0443\u043a\u0430\u0445 \u0431\u044b\u043b\u0430 \u0441\u0430\u0445\u0430\u0440\u043d\u0438\u0446\u0430, \u0438 \u043c\u044b \u0441\u0430\u0445\u0430\u0440 \u0438\u0437 \u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u043b\u0438 \u2013 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u044b\u043f\u0430\u043b\u0441\u044f \u0441\u0430\u0445\u0430\u0440? \u0418\u0434\u0442\u0438 \u0437\u0430 \u0432\u0435\u043d\u0438\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u042d\u0442\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u00ab\u0441\u0438\u0434\u0438\u0442 \u0443 \u043d\u0430\u0441 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\u00bb. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u0430\u0445\u0430\u0440 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043b\u0438, \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0435\u043d\u0438\u043a\u043e\u043c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c.\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043f\u043e\u043a\u0443\u043f\u0430\u0435\u043c \u043f\u044b\u043b\u0435\u0441\u043e\u0441 \u2013 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u043d\u0435 \u0437\u0430 \u0432\u0435\u043d\u0438\u043a\u043e\u043c, \u0430 \u0437\u0430 \u043f\u044b\u043b\u0435\u0441\u043e\u0441\u043e\u043c (\u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438, \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438). \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043e\u0432\u0441\u0435 \u2013 \u0442\u043e\u0433\u0434\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u0430\u0445\u0430\u0440\u0443.<\/p>\n<h3>\u041e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0432 C#<\/h3>\n<p>\u0412 C# \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Web Forms, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u0438\u0434\u0430<\/p>\n<pre><code class=\"cs\">MyButton.Click += new EventHandler(this.MyBtn_Click);<\/code><\/pre>\n<p><code>\u0421lick<\/code> \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441 Button, \u0430 <code>MyBtn_Click<\/code> \u2013 \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0436\u0435, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c. \u0422\u0430\u043a \u043a\u0430\u043a \u0436\u0435 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0437\u043d\u0443\u0442\u0440\u0438?<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c: \u0442\u0430\u043a\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435\u0442. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u043c, \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0430 \u043c\u043e\u0436\u0435\u043c \u0438 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438 \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0443 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430\u0445.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u2013 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443. \u041f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0435\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.<\/p>\n<p><strong>\u0412 C# \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0447\u043b\u0435\u043d\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c event. \u041d\u0430\u0440\u044f\u0434\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438<\/strong>.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cs\">event \u0442\u0438\u043f_\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f;<\/code><\/pre>\n<ul>\n<li>\n<p>\u0442\u0438\u043f_\u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 (\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 += :<\/p>\n<pre><code class=\"cs\">\u0438\u043c\u044f_\u0441\u043e\u0431\u044b\u0442\u0438\u044f += \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a_\u0441\u043e\u0431\u044b\u0442\u0438\u044f;<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c, \u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 .Net 7.0, C# 11. <\/p>\n<pre><code class=\"cs\">class Program {     static void Main()     {         EmailService emailService = new EmailService(emailFrom: \"hr@disney.com\");          \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f         emailService.MailSent += LogToConsole;          emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");     }      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToConsole(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\"); }  \/\/ \u041a\u043b\u0430\u0441\u0441 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 class EmailService {     private readonly string _emailFrom;      public EmailService(string emailFrom)     {         _emailFrom = emailFrom;     }      \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435     public event MailSentEventHandler? MailSent;      public void SendMail(string emailTo, string subject, string body)     {         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0441\u044c\u043c\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e...         \/\/ Send(_emailFrom, emailTo, subject, body);          \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f         var eventArgs = new MailSentEventArgs         {             EmailFrom = _emailFrom,             EmailTo = emailTo,             Subject = subject,             Body = body         };         OnMailSent(eventArgs);     }      \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f     protected virtual void OnMailSent(MailSentEventArgs eventArgs)     {         MailSentEventHandler? mailSentHandler = MailSent;         if (mailSentHandler != null)         {             mailSentHandler(eventArgs);         }     } }  \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f public delegate void MailSentEventHandler(MailSentEventArgs eventArgs);  public record MailSentEventArgs {     public string? EmailFrom { get; init; }     public string? EmailTo { get; init; }     public string? Subject { get; init; }     public string? Body { get; init; } } <\/code><\/pre>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>MailSent<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441 <code>EmailService<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>LogToConsole<\/code>.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043b\u043e\u0433\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430.\u00a0<\/p>\n<p>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Delegate.Combine<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435.<\/p>\n<pre><code class=\"cs\">static void Main()     {         EmailService emailService = new EmailService(emailFrom: \"hr@disney.com\");          \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f         emailService.MailSent += LogToConsole;         emailService.MailSent += LogToFile;          emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");          emailService.MailSent -= LogToFile;         emailService.SendMail(emailTo: \"Milo.Murphy@disney.com\", subject: \"Welcome to Disney\", body: \"Today is your first day...\");     }      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToConsole(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\");      \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435     static void LogToFile(MailSentEventArgs eventArgs)         => Console.WriteLine(             $\"[\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{eventArgs.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 '{eventArgs.EmailFrom}' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 '{eventArgs.EmailTo}': {eventArgs.Body}\"); <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day...<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>add\/remove<\/code> \u0443 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<pre><code class=\"cs\">private MailSentEventHandler? mailSent; public event MailSentEventHandler MailSent { add { mailSent += value; Console.WriteLine($\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a {value.Method.Name} \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\"); } remove { Console.WriteLine($\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a {value.Method.Name} \u0443\u0434\u0430\u043b\u0435\u043d\"); mailSent -= value; } } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cs\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToConsole \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToFile \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... [\u0424\u0430\u0439\u043b] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day... \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a LogToFile \u0443\u0434\u0430\u043b\u0435\u043d [\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 'Welcome to Disney' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 'hr@disney.com' \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 'Milo.Murphy@disney.com': Today is your first day.. <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u2013 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>try catch<\/code> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435.<\/p>\n<pre><code class=\"cs\">static void LogToConsole(MailSentEventArgs eventArgs) { try { throw new Exception(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438\"); } catch (Exception e) { Console.WriteLine(e); } }<\/code><\/pre>\n<h3>EventHandler<\/h3>\n<p>\u0412 .NET \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 EventHandler, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0438\u043f\u0430 System.EventArgs. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043c\u044f \u0442\u0438\u043f\u0430 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e\u043c EventArgs.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 .NET Framework 4.5 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442 System.EventArgs \u0441\u0442\u0430\u043b\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cs\">public class MailSentEventArgs : EventArgs { public string? EmailFrom { get; init; } public string? EmailTo { get; init; } public string? Subject { get; init; } public string? Body { get; init; } }<\/code><\/pre>\n<p>\u0418 \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u043a\u0430\u043a<\/p>\n<pre><code class=\"cs\">public event EventHandler&lt;MailSentEventArgs>? MailSent;<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <strong>object sender<\/strong> \u0438 <strong>MailSentEventArgs args<\/strong>. \u0413\u0434\u0435 <code>sender<\/code> \u2013 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d event, a <code>args<\/code> \u2013 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u043d\u0435\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0438\u043f\u0430 <code>object<\/code>, \u0430 \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u043e \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">public static void LogToConsole(object? sender, MailSentEventArgs args)         => Console.WriteLine(             $\"[\u041a\u043e\u043d\u0441\u043e\u043b\u044c] \u041f\u0438\u0441\u044c\u043c\u043e \u0441 \u0442\u0435\u043c\u043e\u0439 '{args.Subject}' \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0441<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-374315","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=374315"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374315\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=374315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=374315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=374315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}