精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C#委托基礎:談委托和接口

開發(fā) 后端
C#委托是.NET Framework中一個非常炫的特性,我們幾乎每天都會接觸委托,使用委托。本文介紹了有關C#委托的一些基礎。

本文是博客園中近日關于C#委托的討論所衍生出來的一個系列中的***篇,文章作者麒麟.NET對C#委托的內(nèi)涵和外延進行了討論。用麒麟.NET的話來說:“委托是.NET Framework中一個非常炫的特性,絕不會向有些評論里說的那樣,根本沒有機會接觸。恰恰相反,我們幾乎每天都會接觸委托,使用委托。”

那么,先從示例開始,了解什么是C#委托吧。

從示例開始

假設一個系統(tǒng)的用戶登錄模塊有如下所示的代碼

  1. class User  
  2. {  
  3.     public string Name { getset; }  
  4.  
  5.     public string Password { getset; }  
  6. }  
  7.  
  8. class UserService  
  9. {  
  10.     public void Register(User user)  
  11.     {   
  12.         if (user.Name == "Kirin")  
  13.         {  
  14.             Log("注冊失敗,已經(jīng)包含名為" + user.Name + "的用戶");  
  15.         }  
  16.         else 
  17.         {  
  18.             Log("注冊成功!");  
  19.         }  
  20.     }  
  21.  
  22.     privte void Log(string message)  
  23.     {  
  24.         Console.WriteLine(message);  
  25.     }  
  26. }  

UserService類封裝用戶登錄的邏輯,并根據(jù)不同的登錄情況向控制臺打印不同的日志內(nèi)容。當程序關閉時,所記錄的日志自然也隨之消失。

客戶端的代碼為

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         User user = new User { Name = "Kirin", Password = "123" };  
  6.         UserService service = new UserService();  
  7.         service.Register(user);  
  8.         Console.ReadLine();  
  9.     }  

使用策略模式

然而這樣的設計肯定是無法滿足用戶的需求的,用戶肯定希望能夠查看以前的日志記錄,而不僅僅是程序打開以后的內(nèi)容。如果我們僅僅修改Log方法的實現(xiàn),那么用戶需求再次改變時我們該如何處理呢?難道要無休止地修改Log方法嗎?

既然日志記錄的方式是變化的根源,我們自然會想到將其進行封裝。我們創(chuàng)建一個名為ILog的接口。

  1. interface ILog  
  2. {  
  3.     void Log(string message);  
  4. }  

并創(chuàng)建兩個實現(xiàn)了ILog的類,ConsoleLog和TextLog,分別用來向控制臺和文本文件輸出日志內(nèi)容。

  1. class ConsoleLog : ILog  
  2. {  
  3.     public void Log(string message)  
  4.     {  
  5.         Console.WriteLine(message);  
  6.     }  
  7. }  
  8.    
  9. class TextLog : ILog  
  10. {  
  11.     public void Log(string message)  
  12.     {  
  13.         using (StreamWriter sw = File.AppendText("log.txt"))  
  14.         {  
  15.             sw.WriteLine(message);  
  16.             sw.Flush();  
  17.             sw.Close();  
  18.         }  
  19.     }  
  20. }  

在UserService類中添加一個ILog類型的屬性LogStrategy。

  1. class UserService  
  2. {  
  3.     public ILog LogStrategy { getset; }  
  4.  
  5.     public UserService()  
  6.     {  
  7.         LogStrategy = new ConsoleLog();  
  8.     }  
  9.  
  10.     public void Register(User user)  
  11.     {   
  12.         if (user.Name == "Kirin")  
  13.         {  
  14.             LogStrategy.Log("注冊失敗,已經(jīng)包含名為" + user.Name + "的用戶");  
  15.         }  
  16.         else 
  17.         {  
  18.             LogStrategy.Log("注冊成功!");  
  19.         }  
  20.     }  
  21. }  
  22.  

客戶端代碼變?yōu)槿缦滦问健?/P>

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         User user = new User { Name = "Kirin", Password = "123" };  
  6.         UserService service = new UserService { LogStrategy = new TextLog() };  
  7.         service.Register(user);  
  8.         Console.ReadLine();  
  9.     }  

在聲明UserService的時候,還可以將將LogStrategy設置為TextLog。這樣在UserService進行邏輯處理時,使用的LogStrategy即為TextLog,日志將輸出到文本文件中。

我們在干什么?我們在重構。重構的結果是什么?重構的結果是實現(xiàn)了一個簡單的策略模式。

使用委托

然而策略模式仍然不能滿足客戶的需求,這是為什么呢?

1. 用戶也許會希望自定義Log的實現(xiàn)。當然,你可以通過在客戶代碼處擴展ILog來實現(xiàn)自己的日志記錄方式。如

  1. class TextBoxLog : ILog  
  2. {  
  3.     private TextBox textBox;  
  4.  
  5.     public TextBoxLog(TextBox textBox)  
  6.     {  
  7.         this.textBox = textBox;  
  8.         this.textBox.Multiline = true;  
  9.     }  
  10.  
  11.     public void Log(string message)  
  12.     {  
  13.         textBox.AppendText(message);  
  14.         textBox.AppendText(Environment.NewLine);  
  15.     }  
  16. }  
  17.  

但這種方案是否過于復雜呢?如果用戶希望在ListView或其他控件上顯示,是否需要逐個創(chuàng)建新類呢?并且這樣的實現(xiàn)是否與客戶端的耦合過于緊密呢?比如用戶希望在ListView的各個列中顯示日志內(nèi)容、時間、來源等不同內(nèi)容,那么在ListViewLog中對ListView硬編碼是否很難重用呢?

2. 用戶也許會希望同時使用多種日志記錄方式。比如,同時向控制臺、文本文件、客戶端控件和事件查看器中輸出日志。你當然可以在UserService中維護一個List<ILog>,但這時UserService的職責過多,顯然違反了SRP。

下面介紹本文的主角:委托。

我們首先來創(chuàng)建一個名為Log的委托,它接收一個string類型的參數(shù)。

  1. public delegate void Log(string message); 

然后在UserService類中添加一個Log委托類型的屬性LogDelegate。

  1. class UserService  
  2. {  
  3.     public Log LogDelegate { getset; }  
  4.  
  5.  
  6.     // …  
  7. }  

在客戶端,我們直接聲明兩個靜態(tài)方法,它們都包含一個string類型的參數(shù),并且沒有返回值。

  1. static void LogToConsole(string message)  
  2. {  
  3.     Console.WriteLine(message);  
  4. }  
  5.  
  6. static void LogToTextFile(string message)  
  7. {   
  8.     using (StreamWriter sw = File.AppendText("log.txt"))  
  9.     {  
  10.         sw.WriteLine(message);  
  11.         sw.Flush();  
  12.         sw.Close();  
  13.     }  
  14. }  

客戶端聲明UserService的代碼變?yōu)?/P>

  1. static void Main(string[] args)  
  2. {  
  3.     User user = new User { Name = "Kirin", Password = "123" };  
  4.     UserService service = new UserService();  
  5.     service.LogDelegate = LogToConsole;  
  6.     service.LogDelegate += LogToTextFile;  
  7.     service.Register(user);  
  8.      
  9.     Console.ReadLine();  

在構造委托時,我們還可以使用匿名方法和Lambda表達式,在老趙的文章中詳細闡述了這些寫法的演變。

對于何時使用委托,何時使用接口(即策略模式),MSDN中有明確的描述:

在以下情況下,請使用委托:

◆當使用事件設計模式時。

◆當封裝靜態(tài)方法可取時。

◆當調(diào)用方不需要訪問實現(xiàn)該方法的對象中的其他屬性、方法或接口時。

◆需要方便的組合。

◆當類可能需要該方法的多個實現(xiàn)時。

在以下情況下,請使用接口:

◆當存在一組可能被調(diào)用的相關方法時。

◆當類只需要方法的單個實現(xiàn)時。

◆當使用接口的類想要將該接口強制轉換為其他接口或類類型時。

◆當正在實現(xiàn)的方法鏈接到類的類型或標識時:例如比較方法。

您可能覺得上面的例子闡述委托和接口有些過于牽強,事實上有些時候的確很難選擇使用接口還是委托。Java中沒有委托,但所有委托適用的情況同樣可以使用包含單一方法的接口來實現(xiàn)的。在某種程度上,可以說委托是接口(僅定義了單一方法)的一種輕量級實現(xiàn),它更靈活,也更方便。

以上就是對于C#委托中一些基本概念的介紹。

【編輯推薦】

  1. C#委托實例簡單分析
  2. 一個.NET委托的故事:彼得,老板和宇宙
  3. 解惑答疑:C#委托和事件
  4. 各版本.NET委托的寫法回顧
  5. 換一個角度看.NET中的理解委托和事件
責任編輯:yangsai 來源: 博客園
相關推薦

2011-04-22 09:14:26

C#委托

2010-12-22 10:21:17

C#基礎

2009-08-18 10:35:26

C#委托

2009-08-27 16:53:01

C#委托C#事件

2009-08-20 18:37:52

委托C#異步委托

2009-08-20 18:11:08

C#異步委托

2009-10-09 09:07:40

C#委托和事件

2024-05-30 12:24:03

C#開發(fā)

2009-08-18 10:54:17

C#事件和委托

2024-10-05 00:00:35

Action?C#Func?

2009-08-26 14:27:54

C#委托和事件

2024-12-23 08:00:00

委托C#編程

2009-09-01 18:36:35

C#委托實例

2024-09-29 09:28:38

Action?C#

2024-05-16 13:36:04

C#委托事件

2011-05-20 17:50:45

C#

2010-09-14 14:05:42

C#委托

2011-06-16 14:38:18

JavaScript事件委托

2024-05-15 09:11:51

委托事件C#

2009-08-03 13:23:04

C#編程組件-事件-委托
點贊
收藏

51CTO技術棧公眾號

国产欧美在线视频| 日本精品一区二区三区四区的功能| 91在线观看免费网站| 激情五月婷婷在线| 久久动漫网址| 91黄视频在线| 真实国产乱子伦对白视频| 免费在线毛片| 国产一区二区三区美女| 欧美一级视频免费在线观看| 91狠狠综合久久久久久| 岛国精品一区| 日韩福利电影在线| 波霸ol色综合久久| 日本不卡视频一区| 欧美成人黑人| 亚洲成人资源网| 亚洲伊人婷婷| 天堂免费在线视频| 欧美激情1区2区| 欧美日韩精品一区二区三区蜜桃| 日韩伦理在线免费观看| 欧美日韩视频在线播放| 久久久五月婷婷| caoporn国产精品免费公开| 久久精品国产亚洲av麻豆蜜芽| 亚洲午夜一级| 亚洲第一级黄色片| 国产三级三级看三级| 国产一级片在线播放| 国产不卡视频一区| 91久热免费在线视频| 久久人人爽人人爽人人片av免费| 亚洲国内自拍| 欧美精品999| 日本精品人妻无码77777| 成人亚洲综合| 欧美视频在线观看免费网址| av免费看网址| 人妖欧美1区| 一区二区在线看| 三上悠亚免费在线观看| 永久免费av在线| 国产精品天干天干在观线| 久久偷窥视频| 特级西西444www大胆免费看| 久久aⅴ乱码一区二区三区| 亚洲性无码av在线| 在线 丝袜 欧美 日韩 制服| 欧美日一区二区三区| 狠狠色狠狠色综合日日小说| 欧美精品自拍视频| 华人av在线| 狠狠综合久久av一区二区小说| 九一国产精品视频| 免费国产在线观看| 久久老女人爱爱| 欧美另类一区| 国产精品天堂| 国产精品三级av| 亚洲资源在线网| 免费在线观看黄色网| 欧美精品在线视频观看| 亚洲综合欧美激情| 日本午夜精品久久久久| 欧美日韩一区二区在线观看| 欧美第一页浮力影院| 久久精品 人人爱| 欧美日韩高清在线播放| 怡红院亚洲色图| 一本一道久久综合狠狠老精东影业| 插插插亚洲综合网| 四虎884aa成人精品| 亚洲二区三区不卡| 欧美激情第99页| 国偷自拍第113页| 可以免费看不卡的av网站| 国产精品毛片a∨一区二区三区|国| 中文字幕资源网| 国产一区高清在线| 国产精品一区二区av| 午夜在线视频观看| 中文天堂在线一区| www插插插无码免费视频网站| 松下纱荣子在线观看| 欧美亚洲高清一区二区三区不卡| 性生生活大片免费看视频| porn亚洲| 亚洲精品菠萝久久久久久久| 99热自拍偷拍| 成人四虎影院| 精品国产一区二区三区不卡| 90岁老太婆乱淫| 亚洲一区二区三区无吗| 98精品在线视频| 在线观看免费中文字幕| 国产91精品久久久久久久网曝门 | 中文字幕一区二区三区5566| 欧美熟女一区二区| 国产三级精品三级在线专区| 公共露出暴露狂另类av| 性欧美18xxxhd| 91精品免费在线观看| 双性尿奴穿贞c带憋尿| 久久综合国产| 欧美综合在线第二页| 国产乱码精品一区二三区蜜臂| 99久久99久久免费精品蜜臀| 在线国产99| 浪潮色综合久久天堂| 日韩精品影音先锋| 国产农村妇女精品一区| 国产精品入口66mio| 99影视tv| 国产在线69| 欧美亚洲一区三区| 在线观看国产三级| 欧美日本一区二区高清播放视频| 日本精品久久电影| www国产一区| 中文字幕日韩一区二区| 国产精品秘入口18禁麻豆免会员| 亚洲精品视频一二三区| 日韩在线视频观看正片免费网站| 黑人精品无码一区二区三区AV| 国产成人啪免费观看软件| 亚洲午夜在线观看| 欧美理论影院| 亚洲欧美日韩久久久久久| aaaaa级少妇高潮大片免费看| 888久久久| 国产精品一香蕉国产线看观看| 奇米影视888狠狠狠777不卡| 亚洲va在线va天堂| 国产欧美视频一区| 欧美午夜a级限制福利片| 91精品视频网站| 日本在线免费| 欧美日韩高清一区| 国产馆在线观看| 蜜臀av性久久久久蜜臀av麻豆| 日本在线成人一区二区| 92国产精品| 亚洲欧洲高清在线| 亚洲视屏在线观看| 国产精品美女久久久久久久久久久 | 黑人玩欧美人三根一起进| 日韩一区二区三区观看| 欧美又粗又大又长| 国产91精品免费| 国产午夜福利100集发布| 91成人在线精品视频| 欧美激情一级精品国产| 蜜桃视频污在线观看| 亚洲aⅴ怡春院| 国产精品探花一区二区在线观看| 国产一区91| 日韩欧美国产二区| 国产亚洲精品精品国产亚洲综合| 日韩在线观看免费全集电视剧网站 | 67194成人在线观看| 日本高清一二三区| 懂色av一区二区在线播放| 国产妇女馒头高清泬20p多| 欧美日韩一区二区三区不卡视频| 2019中文字幕在线免费观看| 欧美美乳在线| 欧美久久久久免费| 久久精品国产亚洲av麻豆色欲| 99国产精品久久久久久久久久 | 极品美女销魂一区二区三区| 久久天天东北熟女毛茸茸| 成人h动漫精品一区二区器材| 77777少妇光屁股久久一区| 国产在线观看高清视频| 欧美久久一二区| 日韩大片免费在线观看| 国产午夜一区二区三区| 国产乱码一区二区三区四区| 狠狠爱成人网| 日本在线高清视频一区| 精品午夜视频| 日本sm极度另类视频| 日本美女在线中文版| 精品乱码亚洲一区二区不卡| 免费观看日批视频| 悠悠色在线精品| 国产精品无码网站| 激情文学综合插| 1024精品视频| 中文字幕免费精品| 久久免费一区| 日韩在线亚洲| 日本sm极度另类视频| huan性巨大欧美| 在线视频综合导航| 久久r这里只有精品| 久久一留热品黄| 在线观看日本www| 第一社区sis001原创亚洲| 99久热re在线精品视频| 亚洲精品在线影院| 久久久久久久久久久亚洲| 777电影在线观看| 日韩电影中文 亚洲精品乱码| 91麻豆一区二区| 色噜噜久久综合| 国语对白一区二区| 亚洲日本中文字幕区| 韩国女同性做爰三级| 国产精品视区| 中文字幕精品在线播放| 国产精品最新| 精品日韩电影| 天堂精品在线视频| 成人国产精品色哟哟| av中文字幕在线| 精品国产乱码久久久久久牛牛 | 日韩在线播放一区二区| 日韩av高清在线看片| 综合天堂久久久久久久| 亚洲午夜精品久久久中文影院av| 九一精品国产| 精品国产一区二区三区日日嗨| 国产一区二区三区免费在线| 国产精品男人爽免费视频1| 桃色av一区二区| 777777777亚洲妇女| 福利小视频在线| 欧美高清自拍一区| 在线观看的网站你懂的| 欧美v日韩v国产v| 国产又黄又大又爽| 欧美日韩成人综合在线一区二区| 欧美a视频在线观看| 精品毛片网大全| 37p粉嫩大胆色噜噜噜| 丁香婷婷综合激情五月色| 欧美日韩性生活片| 激情久久一区| 久久在线中文字幕| 影音国产精品| 欧美成人高潮一二区在线看| 在线日韩中文| 欧美变态另类刺激| 国产一区二区你懂的| 欧美 丝袜 自拍 制服 另类| 夜久久久久久| 99精品视频播放| 肉肉av福利一精品导航| 三年中国国语在线播放免费| 人人狠狠综合久久亚洲| 一级黄色特级片| 久久草av在线| 欧美亚洲黄色片| 欧美另类精品xxxx孕妇| 免费av中文字幕| 色婷婷av久久久久久久| 永久免费无码av网站在线观看| 一本一道久久a久久精品| 97人妻一区二区精品视频| 一本大道久久精品懂色aⅴ | 99国产精品久久久久久久成人热 | 美女脱光内衣内裤视频久久影院| 麻豆一区二区三区视频| 精品一区二区三区免费观看| 在线观看视频在线观看| www.久久精品| 久久久视频6r| 亚洲色图视频免费播放| 国产精品99精品无码视| 日韩欧美国产成人| 日批视频免费观看| 欧美一区二区三区免费大片| 免费在线观看h片| 亚洲午夜一区二区三区| 日韩精品在线免费视频| 欧美午夜电影在线播放| 国产白浆在线观看| 日韩精品久久久久| 在线免费看黄| 国产69精品久久久| a∨色狠狠一区二区三区| 亚洲r级在线观看| 8av国产精品爽爽ⅴa在线观看| 成人激情黄色网| 九色丨蝌蚪丨成人| 中文精品视频一区二区在线观看| 精品福利电影| 国产精品一区二区小说| 波多野洁衣一区| 熟女少妇a性色生活片毛片| 亚洲午夜免费视频| 中文字幕+乱码+中文| 欧美精品一区男女天堂| 色多多视频在线观看| 久久久久久久久久久成人| 91大神在线观看线路一区| 国产伦精品一区二区三区免| 人人狠狠综合久久亚洲婷| av免费观看国产| 国产精品一区二区三区乱码| 朝桐光av一区二区三区| 一区二区三区在线免费播放| 波多野结衣影片| 亚洲精品国产福利| v天堂福利视频在线观看| 国产精品久久久久999| 成人av影音| 2021国产视频| 老司机免费视频一区二区三区| 波多野结衣视频播放| 成人欧美一区二区三区白人| 中文字幕天堂在线| 亚洲精品福利免费在线观看| 肉肉视频在线观看| 国产一区视频在线| 精品av一区二区| 欧美人xxxxx| 激情久久五月| 亚洲精品一二三四| 国产精品久久久久久久久动漫| 久久亚洲无码视频| 性做久久久久久免费观看欧美| 99er热精品视频| 欧美一区二区三区四区高清| 岛国在线大片| 日本久久精品视频| 欧美午夜18电影| 亚洲中文字幕无码av永久| 国产精品一区二区果冻传媒| 国产人与禽zoz0性伦| 精品视频色一区| 国产精品一区在线看| 日韩免费av一区二区| 青青一区二区| 2022亚洲天堂| 久久理论电影网| 看黄色一级大片| 中文字幕亚洲无线码a| 成人全视频在线观看在线播放高清| 日韩精品一区二区三区色偷偷| 久久久久久色| 91成人在线免费视频| 欧洲一区二区三区在线| 国产午夜视频在线观看| 国产精品久久二区| 日韩综合网站| 亚欧精品在线视频| 一区二区三区 在线观看视频| www.黄色一片| 亚洲91精品在线观看| 欧美成人专区| 国产一区亚洲二区三区| 国产欧美日产一区| 在线观看国产成人| 久久这里有精品视频| 亚洲3区在线| 毛片在线视频播放| 久久日一线二线三线suv| 欧美性猛交xxxx乱大交hd| 宅男66日本亚洲欧美视频| 91麻豆精品一二三区在线| 国产欧美日韩伦理| 99人久久精品视频最新地址| 亚洲做受高潮无遮挡| 欧美性大战久久| v片在线观看| 久久国产精品免费一区| 日韩国产成人精品| 波多野结衣亚洲一区二区| 欧美videossexotv100| 一根才成人网| 中文网丁香综合网| 不卡的看片网站| 久久这里只有精品9| 欧美老女人性生活| 综合干狼人综合首页| 毛片毛片毛片毛| 精品久久久国产| www.久久热.com| 电影午夜精品一区二区三区| 免费看的黄色欧美网站| 777777国产7777777| 亚洲精品ady| 国产精品日本一区二区不卡视频| 日本欧美黄色片| 中文字幕中文字幕在线一区 | 久久久久久无码精品大片| 久久久电影免费观看完整版| 色老太综合网| 二级片在线观看| 久久综合网色—综合色88| 国产精品一二三四五区| 欧美在线一区二区三区四| 911精品美国片911久久久 | 首页亚洲中字| 1314成人网| 欧美视频在线观看一区二区| 999福利在线视频|