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

深入理解C#委托的實質

開發 后端
本文重點剖析C#委托的實質。委托在本質上仍然是一個類,正如很多資料上所說的,委托是一種類型安全的函數回調機制。

本文是博客園麒麟.NET的《把委托說透》系列的第二篇,重點剖析C#委托的實質。

委托在本質上仍然是一個類,我們用delegate關鍵字聲明的所有委托都繼承自System.MulticastDelegate。后者又是繼承自System.Delegate類,System.Delegate類則繼承自System.Object。委托既然是一個類,那么它就可以被定義在任何地方,即可以定義在類的內部,也可以定義在類的外部。

正如很多資料上所說的,委托是一種類型安全的函數回調機制, 它不僅能夠調用實例方法,也能調用靜態方法,并且具備按順序執行多個方法的能力。

C#委托揭秘

把委托說透(1)中可以看到,委托的使用其實是很簡單的。盡管如此,其內部實現仍然相當復雜。.NET強大的編譯器和CLR掩蓋了這種復雜性。

為了解釋方便,我們把(1)中的委托代碼復制在下面,并做一處小小的改動,將LogToTextFile設置為實例方法。

  1. namespace DelegateSample  
  2. {  
  3.  
  4.     public delegate void Log(string message);  
  5.  
  6.     class UserService  
  7.     {  
  8.         public Log LogDelegate { getset; }  
  9.  
  10.         public UserService() { }  
  11.  
  12.         public void Register(User user)  
  13.         {  
  14.             if (user.Name == "Kirin")  
  15.             {  
  16.                 LogDelegate("注冊失敗,已經包含名為" + user.Name + "的用戶");  
  17.             }  
  18.             else 
  19.             {  
  20.                 LogDelegate("注冊成功!");  
  21.             }  
  22.         }  
  23.     }  
  24.  
  25.     class Program  
  26.     {  
  27.         static void Main(string[] args)  
  28.         {  
  29.             User user = new User { Name = "Kirin", Password = "123" };  
  30.             UserService service = new UserService();  
  31.             service.LogDelegate = LogToConsole;  
  32.             Program p = new Program();  
  33.             service.LogDelegate += p.LogToTextFile;  
  34.             service.Register(user);  
  35.  
  36.             Console.ReadLine();  
  37.         }  
  38.  
  39.         static void LogToConsole(string message)  
  40.         {  
  41.             Console.WriteLine(message);  
  42.         }  
  43.  
  44.         void LogToTextFile(string message)  
  45.         {  
  46.             using (StreamWriter sw = File.AppendText("log.txt"))  
  47.             {  
  48.                 sw.WriteLine(message);  
  49.                 sw.Flush();  
  50.                 sw.Close();  
  51.             }  
  52.         }  
  53.     }  
  54. }  
  55.  

打開Reflector反編譯Log委托,可以看到Log類被編譯為如下形式:

反編譯Log委托

在上圖中可以得出如下結論:

委托是一個類

可以很清晰的看出Log—>MulticastDelegate—>Delegate這種繼承機制。

盡管委托繼承自System.MulticastDelegate類,但我們并不能顯示地聲明一個繼承自System.MulticastDelegate類的委托。委托必須使用delegate關鍵字聲明,編譯器會自動為我們生成繼承代碼。

由于委托繼承自System.MulticastDelegate類,自然也繼承MulticastDelegate類的字段、屬性和方法。這些成員中,最重要的當屬三個非公共字段,如下表所示:

字段名稱 字段類型 描述
_target System.Object 該字段指明委托所調用的方法所在的實例類型。如果委托調用的為靜態方法,該字段為null;如果為實例方法則為該方法所在的對象。
_methodPtr System.IntPtr 標識回調方法的指針。
_invocationList System.Object 在構建委托鏈時指向一個委托數組,在委托剛剛構建時通常為null。

由上表可以看出,每個委托對象實際上是對方法及其調用時操作的對象的封裝。MulticastDelegate類還定義了兩個只讀公有實例屬性:Target和Method,分別對應_target和_methodPtr。Target屬性返回一個方法回調時操作的對象引用。如果是靜態方法則返回null。Method屬性返回一個標識回調方法的System.Reflection.MethodInfo對象。

編譯器自動為委托創建了BeginInvoke、EndInvoke和Invoke三個方法

當我們在像調用普通的方法一樣調用委托時,如

  1. LogDelegate("注冊失敗,已經包含名為" + user.Name + "的用戶"); 

這時實際上調用的是編譯器自動生成的Invoke方法

  1. LogDelegate.Invoke("注冊失敗,已經包含名為" + user.Name + "的用戶"); 

使用IL DASM查看UserService的IL代碼,可以驗證以上結論,如下圖所示:

使用IL DASM查看UserService的IL代碼

在使用委托時,我們也可以顯示調用Invoke方法(CLR 2.0)。

顯示調用Invoke方法

Invoke方法的參數和返回值與委托是一致的。在調用Invoke方法時,會使用_target和_methodPtr字段。

BeginInvoke和EndInvoke方法用來實現異步調用,本文在此不進行討論。

委托鏈

委托鏈是一個委托的集合,它允許我們調用這個集合中的委托所代表的所有方法(對于有返回值的方法,委托鏈的返回值為鏈表中最后一個方法的返回值,本文后面會有詳細介紹)。在Delegate類中定義了3個靜態方法來幫助我們操作委托鏈。

  1. public static Delegate Combine(params Delegate[] delegates);  
  2. public static Delegate Combine(Delegate a, Delegate b);  
  3. public static Delegate Remove(Delegate source, Delegate value);  

要理解委托鏈,我們首先基于前面的例子,重新聲明兩個委托:logDel1和logDel2。

  1. Log logDel1 = LogToConsole;  
  2. Program p = new Program();  
  3. Log logDel2 = p.LogToTextFile;  

這兩個委托的_target、_methodPtr和_invocationList值分別如下圖所示:

兩個委托的_target、_methodPtr和_invocationList值

構造委托鏈

然后,我們使用Combin方法來構造一個委托鏈:

  1. Log logChain = null;  
  2. logChain = (Log)Delegate.Combine(logChain, logDel1);  

由于logChain初始為null,在使用Combin方法構造委托鏈時,將返回另外一個參數logDel1,再將logDel1的引用賦給logChain。這時logChain將指向logDel1所指向的對象。

logChain將指向logDel1所指向的對象

接下來我們將logDel2也添加到logChain中來:

  1. logChain = (Log)Delegate.Combine(logChain, logDel2); 

此時,由于logChain已經不再是null,將重新構建一個新的委托對象。該委托對象的_target和_methodPtr字段與logDel2(第二個參數)相同,_invocationList字段將指向一個委托數組。該委托數組中包含兩個元素,第一個元素(索引為0)指向封裝了LogToConsole方法的委托(即logDel1指向的委托);第二個元素(索引為1)指向封裝了LogToTextFile方法的委托(即logDel2指向的委托)。最后,將這個新創建的委托對象的引用賦給logChain。

將這個新創建的委托對象的引用賦給logChain

若再將一個新的委托logDel3添加到委托鏈中,則仍然會構建一個新的委托對象,并將logDel3的引用添加到該委托對象_invocationList的末尾(此時鏈表共有3個元素)。然后,再將該委托對象的引用賦給logChain。而logChain之前指向的委托對象則等待垃圾回收。

至此,委托鏈構造完畢,我們來看看如何執行委托鏈表中的委托。由于logChain仍然指向一個委托對象,因此執行委托鏈表的語法與執行委托是一樣的:

  1. logChain("執行委托鏈"); 

與普通的委托(如logDel1)所不同的是,logChain的_invocationList字段不為null。這時將首先遍歷執行_invocationList中的所有委托。所執行的方法的順序與添加的順序一致,依次為LogToConsole、LogToTextFile。

委托Log的Invoke方法的實現用偽代碼表示如下:

  1. public void Invoke(string message)  
  2. {   
  3.     Delegate[] delegateSet = _InvocationList as Delegate[];  
  4.     if (delegateSet != null)   
  5.     {  
  6.         // 如果委托數組不為空,則依次執行該委托數組中的委托  
  7.         foreach (Feedback d in delegateSet)  
  8.             d(value);  
  9.     }   
  10.     else   
  11.     {  
  12.         // 如果委托數組為空,則該委托不代表一個委托鏈  
  13.         // 按照正常方式執行該委托  
  14.         _methodPtr.Invoke(_target, value);  
  15.     }  
  16. }  

 包含返回值的委托的Invoke實現如下,假設返回值為string:

  1. public string Invoke(string message)  
  2. {  
  3.     string result = null;  
  4.     Delegate[] delegateSet = _InvocationList as Delegate[];  
  5.     if (delegateSet != null)  
  6.     {  
  7.         // 如果委托數組不為空,則依次執行該委托數組中的委托  
  8.         foreach (Feedback d in delegateSet)  
  9.             result = d(value);  
  10.     }  
  11.     else 
  12.     {  
  13.         // 如果委托數組為空,則該委托不代表一個委托鏈  
  14.         // 按照正常方式執行該委托  
  15.         result = _methodPtr.Invoke(_target, value);  
  16.     }  
  17.     return result;  
  18. }  

可以看到在委托鏈中,返回值為鏈表中最后一個委托的返回值。

那么如果對兩個委托鏈調用Combine方法呢?

  1. Log logChain = null;  
  2. Log logChain1 = null;  
  3. Log logChain2 = null;  
  4. logChain1 = (Log)Delegate.Combine(logChain1, logDel1);  
  5. logChain1 = (Log)Delegate.Combine(logChain1, logDel2);  
  6. logChain2 = (Log)Delegate.Combine(logChain2, logDel3;  
  7. logChain2 = (Log)Delegate.Combine(logChain2, logDel4;  
  8. logChain = (Log)Delegate.Combine(logChain1, logChain2);  

最終的結果是,logChain的_target和_methodPtr均與logDel4相同(確切地說,兩個委托對象的_methodPtr字段并不相同,但Method屬性是相同的),而_invocationList中委托的順序依次為logDel1、logDel2、logDel3、logDel4。

綜上所述,可以對Delegate.Combine(Delegate A, Delegate B)方法做如下總結:

1. 如果A和B均為null,則返回null。

2. 如果A或B一個為null而另一個不為null,則返回不為null的委托。

3. 如果A和B均不為null,返回一個新的委托,該委托

    (1)_target字段與B的_target字段的值相同

    (2)Method屬性與B的Method屬性的值相同

    (3)_invocationList字段為一個委托數組,該數組中委托的順序為:A中_invacationList所指向的委托數組 + B中_invacationList所指向的委托數組。

移除委托鏈

Combine方法用來向委托鏈中添加一個委托,而Remove方法用來從委托鏈中移除一個委托。

logChain = (Log)Delegate.Remove(logChain, new Log(LogToConsole));

當調用Remove時,會遍歷(倒序)第一個參數(logChain)中的中的委托列表(_invocationList字段), 找到與第二個參數(new Log(LogToConsole))的_target和_methodPtr字段相匹配的委托,并將其從委托列表中移除。返回值需分以下幾種情況,為了描述方便,我們將logChain記為A,將new Log(LogToConsole)記為B。

1. 如果A為null,返回null。

2. 如果B為null,返回A。

3. 如果A的_invocationList為null,即不包含委托鏈,那么如果A本身與B匹配,則返回null,否則返回A。

4. 如果A的_invocationList中不包含與B匹配的委托,則返回A。

5. 如果A的_invocationList中包含與B匹配的委托,則從鏈表中移除B,然后

    (1)如果A的鏈表中只剩下一個委托,則返回該委托。

    (2)如果A的鏈表中還剩下多個委托,將重新構建一個新的委托R(R的_invocationList字段為A的_invocationList移除了B之后的鏈表),并返回R。

注意,Remove方法只移除源委托的_invocationList列表中第一個匹配的委托,要想移除所有匹配的委托,可以使用RemoveAll方法。

有了委托鏈,在(1)中提出的第二個疑問就迎刃而解了。當用戶希望使用多種日志記錄方式的時候,使用委托鏈可以輕松地添加和刪除某種日志記錄方式,從而避免了人為地維護一個列表。

總結

本文首先介紹了C#委托的實質,委托是一個類,它繼承自System.MulticastDelegate,而MulticastDelegate又繼承自System.Delegate。然后重點剖析了委托鏈,討論了如何創建和移除委托鏈。

【編輯推薦】

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

2024-06-25 08:43:25

C#編程模型

2025-01-09 12:01:53

2024-05-17 12:56:09

C#編程線程

2009-01-20 09:54:13

C# 3.0C#改進

2024-05-11 07:13:33

C#Task編程

2024-06-25 08:33:48

2024-10-11 11:54:14

C#編寫異步

2024-04-10 12:14:36

C++指針算術運算

2009-08-20 18:11:08

C#異步委托

2025-01-15 09:34:02

C#屬性方法

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2024-07-15 08:21:26

TCPC#連接

2022-05-06 16:18:00

Block和 C++OC 類lambda

2012-11-22 10:11:16

LispLisp教程

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood
點贊
收藏

51CTO技術棧公眾號

欧美做爰爽爽爽爽爽爽| 久久久久久久片| 国精产品乱码一区一区三区四区| 成人av在线播放| 亚洲免费av高清| 狠狠久久综合婷婷不卡| 国产一级片免费视频| 婷婷综合激情| 亚洲精品v天堂中文字幕| 好男人www社区| 久操视频在线观看| 91一区二区三区在线观看| 国产精品丝袜视频| 日本学生初尝黑人巨免费视频| 成人短视频软件网站大全app| 国产亚洲欧美激情| 粉嫩av免费一区二区三区| 欧美激情黑白配| 国产精品久久久久9999赢消| 亚洲第一区第一页| av在线网址导航| 性欧美xxx69hd高清| 亚洲欧美福利一区二区| 日本不卡二区| 天堂在线视频观看| 国产乱对白刺激视频不卡 | 亚洲精品视频网| 日韩av网站免费在线| 欧美精品在线网站| 天堂а√在线中文在线鲁大师| 韩日一区二区| 欧美日韩性视频在线| 成人黄色片免费| 欧美成年黄网站色视频| 久久色.com| 国产一区二区三区四区五区加勒比| 日韩成人免费在线视频| 亚洲精品成人影院| 最近2019中文字幕一页二页| 国内精品久久99人妻无码| 大香伊人久久精品一区二区| 91精品国产一区二区三区| 最近中文字幕一区二区| 日韩欧美一区二区三区在线观看| 成人av电影在线| 久久久久久久久爱| 激情四射综合网| 欧美88av| 欧美国产日韩在线| 青青草手机视频在线观看| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 五月婷婷欧美视频| 精品视频在线观看一区| 电影k8一区二区三区久久| 亚洲夂夂婷婷色拍ww47| 中文字幕人妻熟女人妻洋洋| 日本一级理论片在线大全| 亚洲精品视频免费看| 少妇高潮大叫好爽喷水| 精精国产xxxx视频在线| 亚洲少妇30p| 一级黄色免费在线观看| 黄a在线观看| 亚洲一区视频在线| 日韩av高清在线看片| 麻豆网站免费在线观看| 色综合久久中文综合久久牛| 无码人妻丰满熟妇区五十路百度| caopeng在线| 夜夜嗨av一区二区三区网页| 国产美女主播在线| 国产精品迅雷| 欧美日产在线观看| ass极品水嫩小美女ass| 国产精品1luya在线播放| 亚洲精品黄网在线观看| 99久久人妻精品免费二区| 亚洲免费福利一区| 日韩视频中文字幕| 久久久一二三区| 国产精品入口66mio| 国产精品精品国产| jizz中国女人| 94色蜜桃网一区二区三区| 色阁综合av| 91一区二区三区在线| 精品av在线播放| 国产精品区在线| 亚洲精品国产九九九| 日韩精品欧美国产精品忘忧草 | 日韩中文字幕视频网| 欧美精品一区二区高清在线观看| 激情文学亚洲色图| 精品亚洲精品| 日韩在线视频观看正片免费网站| 亚洲乱码国产乱码精品精大量| 亚洲精品不卡在线观看 | 丰满人妻一区二区三区无码av| 久久精品72免费观看| 91久久久一线二线三线品牌| 你懂的视频在线播放| 夜夜爽夜夜爽精品视频| 亚洲最大综合网| 牛牛视频精品一区二区不卡| 日韩在线视频免费观看| 国产超碰人人爽人人做人人爱| 亚洲狼人精品一区二区三区| 国产精品美女主播在线观看纯欲| 区一区二在线观看| 国产成人在线观看| 性欧美大战久久久久久久免费观看| 你懂的在线视频| 亚洲影院久久精品| 亚洲免费999| 亚洲最好看的视频| 久久久久久久一区二区| 一区二区精品视频在线观看| 久久久久久久国产精品影院| 日韩精品免费一区| 亚洲成a人片777777久久| 日韩精品在线免费| 69精品久久久| 国产精品自拍在线| 亚洲韩国在线| 日韩不卡在线| 亚洲欧美日韩精品| 国产区在线观看视频| 成人高清av在线| av日韩在线看| 精品国产亚洲一区二区三区大结局| 日韩久久精品一区| 激情无码人妻又粗又大| 丝瓜av网站精品一区二区| 久久66热这里只有精品| 日韩伦理电影网站| 日韩欧美一二三四区| 午夜爽爽爽男女免费观看| 日韩精品91亚洲二区在线观看| 国产一区二区在线免费| 精品推荐蜜桃传媒| 色素色在线综合| 最近中文字幕免费视频| 亚洲色诱最新| 麻豆91蜜桃| 成人勉费视频| 伊人伊成久久人综合网小说 | 神马精品久久| 岛国av在线不卡| 青青草视频播放| 日韩视频二区| 精品久久久久久一区| 爱搞国产精品| 精品亚洲一区二区| 中文字幕国产在线观看| 国产调教视频一区| 天堂av在线网站| 久久网站免费观看| 91免费看国产| 国产99re66在线视频| 精品国产1区2区3区| 日本一级片免费看| 国产亚洲精品bt天堂精选| 99视频在线视频| 国产精品久久久久9999赢消| av一区二区三区免费| 国产福利电影在线播放| 亚洲精品视频免费| 中文字幕一区二区三区波野结| 99久久精品99国产精品| 久久久久久久久久久免费视频| 97色婷婷成人综合在线观看| 欧美精品在线第一页| 天天干天天插天天操| 日本电影亚洲天堂一区| 免费成人美女女在线观看| 国产一区二区三区黄视频 | 欧美激情专区| 国产原创一区| 久精品免费视频| 天堂成人在线视频| 色天天综合久久久久综合片| 欧美特黄一级片| 成人av免费在线| 国产a视频免费观看| 999久久久91| 国产综合色一区二区三区| 亚洲高清黄色| 欧美国产日韩一区二区| 久草在线免费福利资源| 日韩欧美一卡二卡| 无码人妻丰满熟妇区bbbbxxxx| 99国产精品久久久久久久久久久| 看一级黄色录像| 日韩高清电影免费| 成人激情电影一区二区| 美足av综合网| 日韩在线中文视频| 涩涩视频在线观看免费| 7777精品伊人久久久大香线蕉的| 麻豆视频免费在线播放| 高清国产一区二区| 三级a在线观看| 亚洲一级特黄| 尤物一区二区三区| 丝袜美腿一区二区三区动态图| 久久久久久伊人| 在线a人片免费观看视频| 亚洲а∨天堂久久精品9966| 懂色av中文字幕| 亚洲va国产天堂va久久en| 少妇高潮一区二区三区喷水| 99riav久久精品riav| 性折磨bdsm欧美激情另类| 日韩二区三区四区| 玩弄中年熟妇正在播放| 欧美久久视频| 亚洲一二三区在线| 视频国产一区| 麻豆av一区二区三区久久| 蜜桃精品一区二区三区| 国产欧美婷婷中文| 88xx成人永久免费观看| 欧美一级电影免费在线观看| 女子免费在线观看视频www| 久久精品电影网站| 在线日本中文字幕| 国产亚洲欧洲高清一区| 无码h黄肉3d动漫在线观看| 日韩三级电影网址| 国产男女无套免费网站| 欧美日韩久久不卡| 中文字幕免费视频观看| 色天天综合色天天久久| 久久亚洲精品石原莉奈| 欧美日韩一区二区三区在线免费观看| 五月天综合视频| 99re亚洲国产精品| 欲求不满的岳中文字幕| 成a人片国产精品| 李丽珍裸体午夜理伦片| 成人免费毛片app| 黄色性视频网站| 成人性生交大片| 日本精品一二三区| 成人h精品动漫一区二区三区| 人人爽人人av| 日韩电影免费一区| 手机在线看福利| 日本怡春院一区二区| 日本爱爱免费视频| 久久中文在线| 亚洲精品久久久中文字幕| 蜜芽一区二区三区| 国产乱女淫av麻豆国产| 国内成+人亚洲+欧美+综合在线| 免费黄色日本网站| 男人的天堂成人在线| 国产免费视频传媒| 视频一区视频二区在线观看| 国产熟人av一二三区| 久久成人18免费观看| 久久久精品视频国产| 国产成人av一区二区| 性久久久久久久久久久| 久久综合色天天久久综合图片| 九九九九九伊人| 国产高清久久久| 少妇一级淫免费观看| 久久久www成人免费无遮挡大片| gogo亚洲国模私拍人体| 国产风韵犹存在线视精品| 老司机午夜免费福利| 国产女人18毛片水真多成人如厕| 六十路息与子猛烈交尾| 久久久久久99精品| 日本精品在线免费观看| 一区二区三区在线免费观看| 奇米影视第四色777| 在线日韩国产精品| av网站在线免费看| 亚洲第一中文字幕在线观看| 国产乱视频在线观看| 久久6精品影院| 欧美大片免费观看网址| 亚洲已满18点击进入在线看片 | 亚洲一区中文字幕| 日韩成人精品一区二区三区| 国产精品国模大尺度私拍| 中文字幕中文字幕精品| 中文字幕精品一区日韩| 在线亚洲成人| 日韩av自拍偷拍| 91麻豆免费在线观看| 亚洲欧美精品aaaaaa片| 亚洲成人精品一区| 一区二区日韩在线观看| 精品国产露脸精彩对白 | 24小时成人在线视频| 国产精品一区二区av| 久久精品国产大片免费观看| 老太脱裤子让老头玩xxxxx| 麻豆视频一区二区| 日本黄色录像片| 亚洲欧美一区二区久久| 午夜影院免费在线观看| 欧美v日韩v国产v| 自拍视频在线网| 全亚洲最色的网站在线观看| 国产乱码精品一区二区三区亚洲人| 91久久久精品| 色综合综合网| 国模无码视频一区二区三区| 国产最新精品免费| 色噜噜噜噜噜噜| 日韩欧美亚洲国产一区| а√中文在线资源库| 最近2019中文免费高清视频观看www99| 888av在线| 国语对白做受69| 日韩不卡在线视频| 在线一区亚洲| 美女一区二区视频| 一级黄色性视频| 福利视频导航一区| 天天干视频在线观看| 午夜精品久久久久久久99黑人| 欧美一区久久久| 久久久久久草| 国产欧美大片| 91视频在线免费| 亚洲高清免费观看高清完整版在线观看 | 免费观看黄色一级视频| 美女精品视频一区| 996久久国产精品线观看| 伊人久久大香线蕉精品| 日韩电影免费在线看| 久久视频精品在线观看| 色94色欧美sute亚洲线路一久| 国产理论视频在线观看| 深夜福利日韩在线看| 日韩有码欧美| 免费久久久久久| 国产一区亚洲一区| 日本中文字幕免费在线观看| 91精品国产综合久久久久久| www在线视频| 99久久一区三区四区免费| 欧美黄色aaaa| 在线观看亚洲免费视频| 香蕉成人伊视频在线观看| 无码精品人妻一区二区三区影院| 中文字幕国产亚洲| 欧洲av一区二区| 一本一本久久a久久精品综合妖精| 亚洲精品四区| 91精品小视频| 色哟哟一区二区三区| 北岛玲日韩精品一区二区三区| 久久久久久久影院| 欧美一区 二区| 国产91在线免费| 国产欧美一区二区精品忘忧草 | 亚洲成人影院麻豆| 国产综合久久久久| 午夜久久一区| 国产精品无码在线| 色综合久久六月婷婷中文字幕| 99视频国产精品免费观看a| 九九热99久久久国产盗摄| 午夜视频一区二区在线观看| 国产妇女馒头高清泬20p多| 久久久久久久久蜜桃| 亚洲中文字幕在线一区| 美女精品视频一区| 免费福利视频一区| 爆乳熟妇一区二区三区霸乳| 亚洲色图在线播放| 香蕉视频黄色片| 成人国产精品av| 亚洲美女色禁图| 超碰人人人人人人人| 欧美mv和日韩mv国产网站| 久久91导航| 国产又粗又猛又爽又黄的网站 | 亚洲精品欧美日韩| 亚洲人成免费| 天美传媒免费在线观看| 欧美大片在线观看| 亚洲伦理影院| 国产一区二区三区在线免费| 久久精品亚洲一区二区三区浴池| 天堂中文在线网| 精品国偷自产在线视频| 精品av导航| 婷婷激情综合五月天| 日韩欧美黄色动漫| 欧美黄色视屏| 亚洲国产激情一区二区三区| 国产99久久久国产精品潘金网站| 久久婷婷综合国产|