<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          全面解析:C# 委托的實質(zhì)性應用與優(yōu)勢

          共 12773字,需瀏覽 26分鐘

           ·

          2024-06-20 17:01

          前言


          有人問C#的委托(Delegate)有什么實質(zhì)性用途?委托在C#其實是無處不在,那么它具體用在那里呢?

          本文將從委托(Delegate)定義和演變講起,讓大家一目了然。

          C#的委托(Delegate)是強類型的函數(shù)指針,用于引用方法并允許將方法作為參數(shù)傳遞。隨著C#的演變,委托的功能和用途變得越來越強大和靈活。

          本文將從C#委托的演變談起,詳細介紹其實質(zhì)性用途,并通過代碼實例加以證明。

          委托的演變

          C# 1.0: 基本委托

          在C# 1.0中,引入了基本的委托概念,使得方法可以作為對象傳遞。這是實現(xiàn)事件和回調(diào)機制的基礎。

          using System;  
            
          public delegate void Notify();  // 聲明委托  
            
          public class ProcessBusinessLogic  
          {  
              public event Notify ProcessCompleted;  // 使用委托聲明事件  
            
              public void StartProcess()  
              {  
                  Console.WriteLine("Process Started!");  
                  // 模擬一些處理任務  
                  System.Threading.Thread.Sleep(3000);  
            
                  // 處理完成后觸發(fā)事件  
                  OnProcessCompleted();  
              }  
            
              protected virtual void OnProcessCompleted()  
              {  
                  ProcessCompleted?.Invoke();  
              }  
          }  
            
          class Program  
          {  
              static void Main(string[] args)  
              {  
                  ProcessBusinessLogic bl = new ProcessBusinessLogic();  
                  bl.ProcessCompleted += Bl_ProcessCompleted;  // 訂閱事件  
                  bl.StartProcess();  
              }  
            
              private static void Bl_ProcessCompleted()  
              {  
                  Console.WriteLine("Process Completed!");  
              }  
          }  

          C# 2.0: 匿名方法

          C# 2.0引入了匿名方法,使得委托的使用更加靈活,不需要單獨定義方法即可實現(xiàn)回調(diào)。

          using System;  
            
          public delegate void Print(int value);  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Print print = delegate(int val) {  
                      Console.WriteLine("Anonymous method: {0}", val);  
                  };  
            
                  print(100);  
              }  
          }  

          C# 3.0: Lambda表達式

          C# 3.0進一步引入了Lambda表達式,簡化了委托的語法,使得代碼更加簡潔和易讀。

          using System;  
            
          public delegate void Print(int value);  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Print print = (val) => Console.WriteLine("Lambda expression: {0}", val);  
            
                  print(200);  
              }  
          }  

          C# 4.0及以后: 泛型委托和內(nèi)置委托類型

          隨著C#的不斷發(fā)展,泛型委托和內(nèi)置委托類型(如ActionFuncPredicate)被引入,進一步增強了委托的功能和靈活性。

          using System;  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Action<int> print = val => Console.WriteLine("Action delegate: {0}", val);  
                  print(300);  
            
                  Func<intint> square = x => x * x;  
                  Console.WriteLine("Func delegate: {0}", square(5));  
            
                  Predicate<int> isPositive = x => x > 0;  
                  Console.WriteLine("Predicate delegate: {0}", isPositive(10));  
              }  
          }  

          委托的實質(zhì)性用途

          1、簡單回調(diào)機制

          在編寫需要回調(diào)功能的代碼時,委托可以扮演重要角色。例如,當一個方法完成某項任務時,可以通過回調(diào)通知調(diào)用者。

          using System;  
            
          public delegate void Notify();  // 聲明委托  
            
          public class ProcessBusinessLogic  
          {  
              public event Notify ProcessCompleted;  // 使用委托聲明事件  
            
              public void StartProcess()  
              {  
                  Console.WriteLine("Process Started!");  
                  // 模擬一些處理任務  
                  System.Threading.Thread.Sleep(3000);  
            
                  // 處理完成后觸發(fā)事件  
                  OnProcessCompleted();  
              }  
            
              protected virtual void OnProcessCompleted()  
              {  
                  ProcessCompleted?.Invoke();  
              }  
          }  
            
          class Program  
          {  
              static void Main(string[] args)  
              {  
                  ProcessBusinessLogic bl = new ProcessBusinessLogic();  
                  bl.ProcessCompleted += Bl_ProcessCompleted;  // 訂閱事件  
                  bl.StartProcess();  
              }  
            
              private static void Bl_ProcessCompleted()  
              {  
                  Console.WriteLine("Process Completed!");  
              }  
          }  

          在這個例子中,當StartProcess方法執(zhí)行完畢時,會通過委托Notify通知訂閱者。

          2、多播委托

          多播委托可以引用多個方法,并且在調(diào)用時按順序調(diào)用這些方法。這對于需要依次執(zhí)行多個處理的場景非常有用。

          using System;  
            
          public delegate void Notify();  // 聲明委托  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Notify notify = Method1;  
                  notify += Method2;  // 訂閱多個方法  
            
                  notify();  
              }  
            
              public static void Method1()  
              {  
                  Console.WriteLine("Method1 invoked.");  
              }  
            
              public static void Method2()  
              {  
                  Console.WriteLine("Method2 invoked.");  
              }  
          }  

          在這個例子中,notify委托依次調(diào)用Method1Method2

          3、匿名方法和Lambda表達式

          委托可以結(jié)合匿名方法和Lambda表達式使用,使代碼更加簡潔和靈活。

          using System;  
            
          public delegate void Print(int value);  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Print print = delegate(int val) {  
                      Console.WriteLine("Anonymous method: {0}", val);  
                  };  
            
                  print(100);  
            
                  print = (val) => Console.WriteLine("Lambda expression: {0}", val);  
            
                  print(200);  
              }  
          }  

          在這個例子中,使用匿名方法和Lambda表達式定義委托的實現(xiàn)方式,使代碼更加簡潔。

          4、事件處理

          委托是事件處理的基礎,通過委托可以實現(xiàn)事件的定義和處理。例如,在用戶界面編程中,按鈕的點擊事件處理。

          using System;  
            
          public class Button  
          {  
              public delegate void ClickHandler(object sender, EventArgs e);  
              public event ClickHandler Click;  
            
              public void OnClick(EventArgs e)  
              {  
                  Click?.Invoke(this, e);  
              }  
          }  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  Button button = new Button();  
                  button.Click += Button_Click;  
                  button.OnClick(EventArgs.Empty);  
              }  
            
              private static void Button_Click(object sender, EventArgs e)  
              {  
                  Console.WriteLine("Button clicked!");  
              }  
          }  

          在這個例子中,Button類定義了Click事件,通過委托ClickHandler處理點擊事件。

          5、函數(shù)式編程

          委托允許將函數(shù)作為對象處理,使得C#能夠支持一定程度的函數(shù)式編程。例如,LINQ(Language Integrated Query)大量使用了委托和Lambda表達式。

          using System;  
          using System.Linq;  
          using System.Collections.Generic;  
            
          public class Program  
          {  
              public static void Main(string[] args)  
              {  
                  List<int> numbers = new List<int> { 12345 };  
                  List<int> evenNumbers = numbers.Where(n => n % 2 == 0).ToList();  
            
                  evenNumbers.ForEach(n => Console.WriteLine(n));  
              }  
          }  

          在這個例子中,Where方法接受一個委托Func<int, bool>來篩選列表中的偶數(shù)。

          總結(jié)

          C#的委托從基本概念到匿名方法,再到Lambda表達式和泛型委托,其演變展示了語言的強大和靈活。

          委托在回調(diào)、多播、事件處理以及函數(shù)式編程中的廣泛應用,極大地增強了C#的功能和代碼可維護性。

          通過本文的示例,可以清晰地看到委托的實質(zhì)性用途和在現(xiàn)代編程中的重要地位。

          希望本文對大家有所收獲,大家對委托有什么看法,歡迎留言討論。

          轉(zhuǎn)自:莫小星

          鏈接:mp.weixin.qq.com/s/93d5QW4LsC20G0v1re9bEw







          回復 【關閉】學永久關閉App開屏廣告
          回復 【刪除】學自動檢測那個微信好友刪除、拉黑
          回復 【手冊】獲取3萬字.NET、C#工程師面試手冊
          回復 【幫助】獲取100+個常用的C#幫助類庫
          回復 【加群】加入DotNet學習交流群

          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  俺来也色婷婷 | 性爱av无码 | 色五月五月婷婷 | 夜夜夜夜撸一撸 | 成人在线偷拍视频 |