{"id":604,"date":"2022-05-05T14:04:47","date_gmt":"2022-05-05T07:04:47","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=604"},"modified":"2022-12-30T09:50:55","modified_gmt":"2022-12-30T02:50:55","slug":"csharp-events","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-events\/","title":{"rendered":"C# Events"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about C# events and how to use events effectively to design the loose coupling applications.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to C# events<\/h2>\n\n\n\n<p>Events are something that occurs in a program. Events allow a <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-class\/\">class<\/a> or object to notify other classes or objects when something occurs. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The class that raises (or sends) the event is called the <strong>publisher<\/strong>.<\/li>\n\n\n\n<li>The classes that receive (or handle) the event are called <strong>subscribers<\/strong>. And the method of the classes that handle the event is often called event handlers.<\/li>\n<\/ul>\n\n\n\n<p>This pattern is known as <strong>publisher\/subscriber<\/strong>. In this pattern, the publisher determines when to raise the event and the subscribers decide how to handle the event.<\/p>\n\n\n\n<p>Technically, an event has an encapsulated <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/c-delegate\/\">delegate<\/a>. In fact, an event is like a simpler delegate. Let&#8217;s take an example of using events.<\/p>\n\n\n\n<p>Suppose you have a class called <code>Order<\/code> with a method <code>Create()<\/code> that creates a new order:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And two other classes that send an email and SMS:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Email<\/span> \n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Send an email\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SMS<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Send an SMS\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>When an order is created, you want to send an email and SMS to the customer. To do it, you may come up with the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order was created\"<\/span>);\n        Email.Send();\n        SMS.Send();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Later if you want to do other tasks when an order is created, you have to modify the <code>Create()<\/code> method. Also, the Order class depends on the Email and SMS classes which is not a good design.<\/p>\n\n\n\n<p>To resolve this, you can use the publisher\/subscriber pattern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>Order<\/code> class is the publisher. <\/li>\n\n\n\n<li>The <code>Email<\/code> and <code>SMS<\/code> classes are the subscribers.<\/li>\n<\/ul>\n\n\n\n<p>When an order is created, the <code>Order<\/code> object will notify the <code>Email<\/code> and <code>SMS<\/code> classes to send an email and SMS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Declaring an event<\/h2>\n\n\n\n<p>The following declares the <code>OnCreated<\/code> event when an order is created:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">delegate<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OrderEventHandler<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> OrderEventHandler OnCreated;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define a delegate type for the event:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">delegate<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OrderEventHandler<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, declare an event associated with the delegate type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> OrderEventHandler OnCreated;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Since an event is a member of a class, you need to declare it inside the class. In this example, the event is public so that other classes can register event handlers with it. Also, the event handlers must match the delegate type associated with the event.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Raising an event<\/h2>\n\n\n\n<p>Raising an event is the same as invoking a method. An event that doesn&#8217;t have any event handlers is null. Therefore, before raising an event, you need to compare it to <code>null<\/code>.<\/p>\n\n\n\n<p>The following raises the <code>OnCreated<\/code> event inside the <code>Create()<\/code> method:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> OrderEventHandler OnCreated;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n        \n        <span class=\"hljs-keyword\">if<\/span>(OnCreated != <span class=\"hljs-literal\">null<\/span>)\n        {\n            OnCreated();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Subscribing to an event<\/h2>\n\n\n\n<p>Subscribing to an event means adding event handlers to an event. The event handlers must have the same return type and signature as the event&#8217;s delegate.<\/p>\n\n\n\n<p>To add an event handler to an event, you use the <code>+=<\/code> operator. The event handler can be an instance method, a <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-static-method\/\">static method<\/a>, an anonymous method, or a lambda expression.<\/p>\n\n\n\n<p>The following shows how to subscribe <code>OnCreated<\/code> event:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> order = <span class=\"hljs-keyword\">new<\/span> Order();\n\n        order.OnCreated += Email.Send;\n        order.OnCreated += SMS.Send;\n\n        order.Create();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Order created\nSend an email\nSend an SMS<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, create a new <code>Order<\/code> object:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">var<\/span> order = <span class=\"hljs-keyword\">new<\/span> Order();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, add event handlers to the <code>OnCreated<\/code> event:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">order.OnCreated += Email.Send;\norder.OnCreated += SMS.Send;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, call the <code>Create()<\/code> method of the <code>Order<\/code> object:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">order.Create();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Create()<\/code> method raises the <code>OnCreated<\/code> event. Since the <code>Email<\/code> and <code>SMS<\/code> classes are subscribed to the <code>OnCreated<\/code> event, the <code>Send()<\/code> methods of these classes are automatically called.<\/p>\n\n\n\n<p>Put it all together:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">delegate<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OrderEventHandler<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> OrderEventHandler OnCreated;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n        \n        <span class=\"hljs-keyword\">if<\/span>(OnCreated != <span class=\"hljs-literal\">null<\/span>)\n        {\n            OnCreated();\n        }\n    }\n}\n\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Email<\/span> \n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an email\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SMS<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an SMS\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> order = <span class=\"hljs-keyword\">new<\/span> Order();\n\n        order.OnCreated += Email.Send;\n        order.OnCreated += SMS.Send;\n\n        order.Create();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">EventHandler<\/h2>\n\n\n\n<p>C# provides you with the standard <code>EventHandler<\/code> delegate type so that you don&#8217;t need to define a new delegate type when you use events.<\/p>\n\n\n\n<p>The following shows the declaration of the <code>EventHandler<\/code> delegate type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">delegate<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">EventHandler<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, EventArgs e<\/span>)<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this delegate type:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>sender<\/code> holds a reference to the object that raised the event.<\/li>\n\n\n\n<li>The <code>EventArgs<\/code> object holds the state information which can be whatever that is applicable to the application.<\/li>\n<\/ul>\n\n\n\n<p>It&#8217;s important to understand that the <code>EventArgs<\/code> is designed for event handlers that do not need to pass data from the publisher to subscribers. If you want to pass the data, you need to define a class derived from the <code>EventArgs<\/code> class.<\/p>\n\n\n\n<p>The following program shows how to use the <code>EventHandler<\/code> for the order created event:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> EventHandler OnCreated;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n        \n        <span class=\"hljs-keyword\">if<\/span>(OnCreated != <span class=\"hljs-literal\">null<\/span>)\n        {\n            OnCreated(<span class=\"hljs-keyword\">this<\/span>, EventArgs.Empty);\n        }\n    }\n}\n\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Email<\/span> \n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, EventArgs e<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an email\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SMS<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, EventArgs e<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an SMS\"<\/span>);\n    }\n}\n\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> order = <span class=\"hljs-keyword\">new<\/span> Order();\n\n        order.OnCreated += Email.Send;\n        order.OnCreated += SMS.Send;\n\n        order.Create();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, use the <code>EventHandler<\/code> instead of the <code>OrderEventHandler<\/code> delegate type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> EventHandler OnCreated;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, raise the <code>OnCreated<\/code> event by passing the <code>Order<\/code> object (this) and <code>EventArgs.Empty<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">OnCreated(<span class=\"hljs-keyword\">this<\/span>, EventArgs.Empty);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Note that the <code>EventArgs.Empty<\/code> provides a value to use with an event that does not have event data.<\/p>\n\n\n\n<p>Third, modify the signature of the <code>Send()<\/code> method of the <code>Email<\/code> and <code>SMS<\/code> classes to match with the <code>EventHandler<\/code> delegate type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, EventArgs e<\/span>)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Passing data by extending EventArgs<\/h2>\n\n\n\n<p>To pass data in the second parameter of the event handler from the publisher to subscribers, you need to define a class that inherits from the <code>EventArgs<\/code> class and store the data that you want to pass in the class.<\/p>\n\n\n\n<p>The following program illustrates how to pass data (Email &amp; Phone) from the publisher (<code>Order<\/code> class) to the subscribers ( Email and SMS classes).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OrderEventArgs<\/span> : <span class=\"hljs-title\">EventArgs<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Email { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Phone { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Order<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> EventHandler&lt;OrderEventArgs&gt; OnCreated;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Create<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> email, <span class=\"hljs-keyword\">string<\/span> phone<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Order created\"<\/span>);\n\n        <span class=\"hljs-keyword\">if<\/span>(OnCreated != <span class=\"hljs-literal\">null<\/span>)\n        {\n            OnCreated(<span class=\"hljs-keyword\">this<\/span>, <span class=\"hljs-keyword\">new<\/span> OrderEventArgs { Email = email, Phone = phone });\n        }\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Email<\/span> \n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, OrderEventArgs e<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an email to <span class=\"hljs-subst\">{e.Email}<\/span>\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SMS<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, OrderEventArgs e<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Send an SMS to <span class=\"hljs-subst\">{e.Phone}<\/span>\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> order = <span class=\"hljs-keyword\">new<\/span> Order();\n\n        order.OnCreated += Email.Send;\n        order.OnCreated += SMS.Send;\n\n        order.Create(<span class=\"hljs-string\">\"john@test.com\"<\/span>, <span class=\"hljs-string\">\"(408)-111-2222\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Order id <span class=\"hljs-number\">1<\/span> created with the amount <span class=\"hljs-number\">100<\/span>\nSend an email to john@test.<span class=\"hljs-function\">com\nSend an SMS <span class=\"hljs-title\">to<\/span> (<span class=\"hljs-params\"><span class=\"hljs-number\">408<\/span><\/span>)-111-2222<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define the <code>OrderEventArgs<\/code> class that inherits from the <code>EventArgs<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OrderEventArgs<\/span> : <span class=\"hljs-title\">EventArgs<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Email { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Phone { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the event using the <code>EventHanlder<\/code> with the <code>OrderEventArgs<\/code> type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">event<\/span> EventHandler&lt;OrderEventArgs&gt; OnCreated;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, raise an event and a new instance of the <code>OrderEventArgs<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">OnCreated(<span class=\"hljs-keyword\">this<\/span>, <span class=\"hljs-keyword\">new<\/span> OrderEventArgs { Email = email, Phone = phone });<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this statement, the <code>OrderEventArgs<\/code> object contains the email and phone data.<\/p>\n\n\n\n<p>Fourth, change the <code>Send()<\/code> method&#8217;s signature to use the <code>OrderEventArgs<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Send<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> sender, OrderEventArgs e<\/span>)<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the <code>Send()<\/code> method, you can access the email &amp; phone number via the <code>OrderEventArgs<\/code> object.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Events allow a class or object to notify other classes or objects when something occurs.<\/li>\n\n\n\n<li>Events are used in a publisher\/subscriber pattern in which the publisher raises an event and the subscribers respond to the event.<\/li>\n\n\n\n<li>Use <code>EventHandler<\/code> as the delegate type to declare an event.<\/li>\n\n\n\n<li>Extend the <code>EventArgs<\/code> class to pass data from the publisher to subscribers.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"604\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-events\/\"\n\t\t\t\tdata-post-title=\"C# Events\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"604\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-events\/\"\n\t\t\t\tdata-post-title=\"C# Events\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you&#8217;ll learn about C# events and how to use events effectively to design the loose coupling applications. Introduction to C# events Events are something that occurs in a program. Events allow a class or object to notify other classes or objects when something occurs. This pattern is known as publisher\/subscriber. In [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":7,"menu_order":74,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-604","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/604","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=604"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/604\/revisions"}],"predecessor-version":[{"id":740,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/604\/revisions\/740"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/7"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}