Hi guys, I wish you a productive and energetic day at the beginning of the week. Today I will introduce delegates in C#, a fairly popular feature. Don’t let you wait long, let’s start with the article. In this article, I will talk about the definition, usage and simple example of delegate in c#.
1. What is Delegate?
- Delegate is a special data type in C# used to declare references to functions or methods (Can be understood as a pointer to a function). When assigning a function or method to a delegate, the delegate will point a reference to that function or method. Then instead of calling the function directly, we can use the delegate to call it without knowing the name of the function. Delegates make calling functions more flexible.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token keyword">using</span> <span class="token namespace">System</span> <span class="token punctuation">;</span> <span class="token keyword">delegate</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">CalculatorDelegate</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> num1 <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> num2 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Khởi tạo delegate</span> <span class="token class-name">CalculatorDelegate</span> calculatorDelegate <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">CalculatorDelegate</span> <span class="token punctuation">(</span> MaxNumber <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Gọi phương thức thông qua delegate</span> <span class="token class-name"><span class="token keyword">int</span></span> result <span class="token operator">=</span> <span class="token function">calculatorDelegate</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// In ra giá trị lớn nhất của hai số</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token string">"Max number: "</span> <span class="token operator">+</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">MaxNumber</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> num1 <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> num2 <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> num1 <span class="token operator">></span> num2 <span class="token punctuation">)</span> <span class="token punctuation">?</span> num1 <span class="token punctuation">:</span> num2 <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- In the above example, instead of directly calling the MaxNumber function to find the largest of two numbers, we call the delegate variable calculatorDelegate.
2. Use delegates to call different functions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <span class="token keyword">using</span> <span class="token namespace">System</span> <span class="token punctuation">;</span> <span class="token comment">// Khai báo delegate</span> <span class="token keyword">delegate</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">Calculator</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> a <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> b <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">Add</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> a <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> b <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">+</span> b <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">Subtract</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> a <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> b <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">-</span> b <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Tạo instance của delegate, truyền phương thức Add vào delegate</span> <span class="token class-name">Calculator</span> calculator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Calculator</span> <span class="token punctuation">(</span> Add <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Sử dụng delegate để tính tổng của 2 số</span> <span class="token class-name"><span class="token keyword">int</span></span> result <span class="token operator">=</span> <span class="token function">calculator</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token string">"10 + 5 = "</span> <span class="token operator">+</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Truyền phương thức Subtract vào delegate</span> calculator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Calculator</span> <span class="token punctuation">(</span> Subtract <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Sử dụng delegate để tính hiệu của 2 số</span> result <span class="token operator">=</span> <span class="token function">calculator</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token string">"10 - 5 = "</span> <span class="token operator">+</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> Console <span class="token punctuation">.</span> <span class="token function">ReadKey</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- In the above example, we use the delegate calculator to call the Add method if we assign calculator = new Calculator(Add); call the Subtract method if we assign calculator = new Calculator(Subtract);.
- By using the same delegate to call different functions, we find calling the function very flexible and easy.
3. Use a delegate to create a callback
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">using</span> <span class="token namespace">System</span> <span class="token punctuation">;</span> <span class="token keyword">delegate</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Callback</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span></span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">CallMethodWithCallback</span> <span class="token punctuation">(</span> <span class="token string">"Hello, world!"</span> <span class="token punctuation">,</span> DisplayMessage <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">CallMethodWithCallback</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span></span> message <span class="token punctuation">,</span> <span class="token class-name">Callback</span> callback <span class="token punctuation">)</span> <span class="token punctuation">{</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token string">"Method called with message: "</span> <span class="token operator">+</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">callback</span> <span class="token punctuation">(</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">DisplayMessage</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span></span> message <span class="token punctuation">)</span> <span class="token punctuation">{</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token string">"Callback called with message: "</span> <span class="token operator">+</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- In the above example, we see that we will declare a callback with the delegate delegate void Callback(string message);. When we call the function CallMethodWithCallback we can pass the function as an argument: CallMethodWithCallback(“Hello, world!”, DisplayMessage);
- The above example will output:
1 2 3 | Method called <span class="token class-name">with</span> message <span class="token punctuation">:</span> Hello <span class="token punctuation">,</span> world <span class="token operator">!</span> Callback called <span class="token class-name">with</span> message <span class="token punctuation">:</span> Hello <span class="token punctuation">,</span> world <span class="token operator">!</span> |
4. Using delegates in Lambda Expression
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">delegate</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">Operation</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> a <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> b <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Khai báo delegate</span> <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Sử dụng delegate trong lambda expression</span> <span class="token class-name">Operation</span> sum <span class="token operator">=</span> <span class="token punctuation">(</span> a <span class="token punctuation">,</span> b <span class="token punctuation">)</span> <span class="token operator">=></span> a <span class="token operator">+</span> b <span class="token punctuation">;</span> <span class="token class-name">Operation</span> product <span class="token operator">=</span> <span class="token punctuation">(</span> a <span class="token punctuation">,</span> b <span class="token punctuation">)</span> <span class="token operator">=></span> a <span class="token operator">*</span> b <span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">int</span></span> x <span class="token operator">=</span> <span class="token number">5</span> <span class="token punctuation">,</span> y <span class="token operator">=</span> <span class="token number">3</span> <span class="token punctuation">;</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token interpolation-string"><span class="token string">$"Tổng của </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp">x</span> <span class="token punctuation">}</span></span><span class="token string"> và </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp">y</span> <span class="token punctuation">}</span></span><span class="token string"> là </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp"><span class="token function">sum</span> <span class="token punctuation">(</span> x <span class="token punctuation">,</span> y <span class="token punctuation">)</span></span> <span class="token punctuation">}</span></span> <span class="token string">"</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Kết quả: Tổng của 5 và 3 là 8</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> <span class="token interpolation-string"><span class="token string">$"Tích của </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp">x</span> <span class="token punctuation">}</span></span><span class="token string"> và </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp">y</span> <span class="token punctuation">}</span></span><span class="token string"> là </span><span class="token interpolation"><span class="token punctuation">{</span> <span class="token expression language-csharp"><span class="token function">product</span> <span class="token punctuation">(</span> x <span class="token punctuation">,</span> y <span class="token punctuation">)</span></span> <span class="token punctuation">}</span></span> <span class="token string">"</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Kết quả: Tích của 5 và 3 là 15</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">int</span></span> <span class="token function">Sum</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">int</span></span> x <span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> y <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> x <span class="token operator">+</span> y <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span> <span class="token punctuation">(</span> <span class="token class-name"><span class="token keyword">string</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span></span> args <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Func <span class="token punctuation"><</span> <span class="token keyword">int</span> <span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token punctuation">></span></span> <span class="token keyword">add</span> <span class="token operator">=</span> Sum <span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">int</span></span> result <span class="token operator">=</span> <span class="token keyword">add</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Console <span class="token punctuation">.</span> <span class="token function">WriteLine</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Func<int, int, int> is a delegate of type int with two arguments of type int.
5. Summary
- There are many ways to use delegates in c#, here I just introduce the concept and simple examples so that you can understand what a delegate is and how to use it simply.
- Thank you to everyone who viewed the article. Have a nice weekend everyone.
- If you have any questions about the parts of this article, you can inbox via facebook: https://www.facebook.com/FriendsCode-108096425243996 I will answer questions within my understanding. Thanks everyone!
- Or contact me via my personal facebook: https://www.facebook.com/Flamesofwars/