国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文搞定泛型,提高代碼復(fù)用率及程序的運行性能

原創(chuàng)
開發(fā) 后端
泛型是程序設(shè)計語言的一種風格,允許程序員在強類型程序設(shè)計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數(shù)指明這些類型。

[[319139]]

【51CTO.com原創(chuàng)稿件】泛型是程序設(shè)計語言的一種風格,允許程序員在強類型程序設(shè)計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數(shù)指明這些類型。泛型在 .NET 中應(yīng)用尤其廣泛,泛型是在 .NET 2.0 CLR 中的增加的一項新功能,類似于 C++ 的模板但不如 C++ 的模板靈活,不過也有一些自己的特性。泛型為 .NET 引入了類型參數(shù)的概念,這樣便可以把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候執(zhí)行。下面我們就來講解一下泛型的知識。

一、當 C# 沒有泛型

在 .NET 2.0 以前沒有泛型的時候,開發(fā)人員一直在使用 System.Collections.Stack 類,它是一個棧類型的集合對象。 Stack 通過 Push 和 Pop 方法向集合中添加和刪除數(shù)據(jù)。很多開發(fā)人員通過前面的描述都會認為使用 Stack 很簡單,但是其中存在一個重大的缺陷。 Stack 類所保存的是 object 類型,這樣就導致了 CLR 無法驗證 push 進集合中的對象是不是想要的類型。

此外當我們使用 Pop 方法時需要將它的返回值轉(zhuǎn)換為我們需要的類型,因此這里就存在一個問題,如果 Pop 方法的返回值不是我們需要的類型那么就有很大可能引發(fā)異常。這里的返回值轉(zhuǎn)換使用的是強制類型轉(zhuǎn)換,由于使用了強制類型轉(zhuǎn)換將類型檢查放在了運行時進行,因此代碼就變得更加脆弱。

使用 Stack 類還存在一個性能問題,將值類型的實例傳遞給 Push 方法,運行時將會對它進行裝箱操作,頻繁的執(zhí)行值類型裝箱操作,系統(tǒng)會頻繁的分配內(nèi)存、復(fù)制值已經(jīng)進行垃圾回收,這樣就導致了大量的性能開銷。通過前面的描述部分讀者應(yīng)該看出來了 Stack 類不是類型安全的類,因此在不使用泛型的情況下,我們?nèi)绻薷?Stack 類并保證它是類型安全的,并且要求它存儲指定的類型的話,我們必須這么做:

  1. public class StackDemo  
  2.  
  3. public virtual User Pop();  
  4. public virtual void Push(User user);  
  5. //more code  

上面的代碼是不是很簡單?如果你真的這么認為那么你就是想多了,由于我們要求只能存儲 User 類型的隊形,因此我們需要對 Stack 的每個方法進行重寫實現(xiàn),如果我們還需要一個存儲 Student 類型的 Stack ,我們就需要再重寫一次 Stack 的每個方法。這就凸顯了一個問題,代碼中產(chǎn)生了大量的類似的代碼和重復(fù)的代碼。

另外在沒有泛型的情況下如果聲明允許包含 Null 值的變量的時候就比較麻煩了。一般情況下我們常用的有兩種方法。

方法一:對需要處理 null 值的每個類型都需要聲明可空數(shù)據(jù)類型,我們來看個簡單的例子:

  1. struct NullInt  
  2.  
  3. public int Value { get; private set;}  
  4. public bool HasValue {get; private set;}  

上述例子很簡單,但是存在兩個問題,首先如果我們有很多可空類型的話,我們就需要編寫大量的類似代碼,其次如果可空值類型發(fā)生了改變那么我們就必須修改所有的可能類型聲明,可想而知工作量是非常巨大的,而且也很容易出現(xiàn)紕漏和錯誤。

方法二:這個方法的出現(xiàn)就是為了解決我們在方法一中所提到的兩個問題。我們只需要聲明一個可能類型即可,類型中包含 object 類型的 Value 屬性,同樣我們先來看一下代碼:

  1. struct NullType  
  2.  
  3. public object Value {get; private set;}  
  4. public bool HasValue {get; private set;}  

這個方法雖然充分解決了方法一出現(xiàn)的問題,但是它并不完美。因為運行時在設(shè)置 Value 屬性的時候總是會對值類型進行裝箱,另外通過 NullType.Value 獲取值地時候需要進行強制類型裝換,這個操作在運行時可能會報錯。

二、泛型概述

泛型類型是 C# 2.0 引入的,它的引入在一定程度上減輕了開發(fā)人員的壓力,同時也使得程序變得更加健壯和穩(wěn)定。泛型類的語法也很簡單,用尖括號聲明泛型類型參數(shù)和提供泛型類型實參即可。我們來看一個定義泛型的例子:

  1. public class DataBaseOperating  
  2.  
  3. private T[] ModelArray{get;}  
  4. public bool Insert(T t)  
  5.  
  6. //more code  
  7.  
  8. public T SelectOne()  
  9.  
  10. //more code  
  11.  
  12. public List SelectAll()  
  13.  
  14. //more code  
  15.  
  16. //more code  

前面這段代碼,我們定義了操作數(shù)據(jù)庫的泛型類,這個類可以被項目中所有需要操作數(shù)據(jù)庫的類使用,我們只需將類型實參傳遞進來即可。例如我們需要向數(shù)據(jù)庫插入一條 User 數(shù)據(jù)。我們可以這么做:

  1. //more code  
  2. DataBaseOperating dbOp=new DataBaseOperating();  
  3. dbOp.Insert(user);  
  4. //more code 

我們看到在定義泛型類的時候,我定義類型參數(shù)用的是 T ,這么做是大部分 C# 開發(fā)人員的一個習慣,也可以說是一個大家都默認的規(guī)范,我們在開發(fā)時一般都會使用以大寫字母 T 作為前綴來表明它是一個類型參數(shù)。泛型的定義和使用就這么多,是不是很簡單呢?下面我們就來講解一下泛型的各個方面。在學習泛型類之前我們要先來了解一下它的優(yōu)點,來看看為什么微軟在 C# 2.0 中引入了泛型類。

泛型促進了類型安全,它確保了參數(shù)化類中只有成員明確希望的數(shù)據(jù)類型才可以使用;

類型檢查會在編譯時發(fā)生進而減少了在運行時出現(xiàn)強制類型轉(zhuǎn)換無效的錯誤;

泛型類成員使用的是值類型,因此就不會出現(xiàn) object 裝箱轉(zhuǎn)換操作。并且代碼既保持具體類的優(yōu)勢又避免了具體類的開銷,這樣代碼的性能得以提高,內(nèi)存消耗也變得很少。

構(gòu)造函數(shù)

我們在開發(fā)中經(jīng)常用到構(gòu)造函數(shù),在泛型類和泛型結(jié)構(gòu)中同樣也適用構(gòu)造函數(shù)。泛型類/結(jié)構(gòu)的構(gòu)造函數(shù)和普通類/結(jié)構(gòu)的構(gòu)造函數(shù)是一模一樣的,不需要類型參數(shù)只需要按照普通類/結(jié)構(gòu)的構(gòu)造函數(shù)定義方法定義即可。

  1. public class Demo  
  2.  
  3. public T key {get;set;}  
  4. public Demo(T t)  
  5.  
  6. key=t;  
  7.  
  8.  
  9. public struct Demo  
  10.  
  11. public T value {get;set;}  
  12. public Demo(T t)  
  13.  
  14. value=t;  
  15.  

Tip:構(gòu)造函數(shù)包含類型參數(shù)也可以

結(jié)構(gòu)與接口

在 C# 中不僅僅存在泛型類,還存在泛型接口和泛型結(jié)構(gòu)。泛型接口和泛型結(jié)構(gòu)的語法和泛型類相同。這里主要講解一下在類中多次實現(xiàn)同一個泛型接口。我們先來看一下代碼:

  1. public interface IDemo  
  2.  
  3. ICollection items {get;set;}  
  4.  
  5. public class Demo:IDemo,IDemo  
  6.  
  7. ICollection IDemo.items {get;set;}  
  8. ICollection IDemo.items {get;set;}  

在上述代碼中,我們在類中顯示實現(xiàn)了兩個不同類型實參的同一個泛型接口,一般來說在類中多次實現(xiàn)泛型接口并非是一個最優(yōu)的選擇,因為它會造成代碼的混淆以及在使用的過程中造成誤會。因此除非特殊情況,絕大多數(shù)情況下,我們不應(yīng)該在一個類中多次實現(xiàn)同一個接口。

默認值

當我們需要在泛型類的構(gòu)造函數(shù)中部分屬性進行初始化,而其他屬性不進行初始化,但是我們在開發(fā)中無法確定傳入泛型類中的類型參數(shù)是什么,因此我們也無法通過具體的值設(shè)置默認值。這種情況在 C# 中可以說是非常好解決,我們可以調(diào)用 default 操作符來給傳入的任意類型參數(shù)提供默認值。例如下面這段代碼,我們只初始化 Key ,Value 的初始化則利用 default 操作符。

  1. public class Demo  
  2.  
  3. T tKey {get;set;}  
  4. T tValue {get;set;}  
  5. public Demo(T key 
  6.  
  7. tKey=key 
  8. tValue=default(T);  
  9.  

Tip:default 中的參數(shù)并非是必須傳入的,在 C#7 中如果可以推斷出數(shù)據(jù)類型的話是不需要指定參數(shù)的。比如 Demo demo = default(T) 就可以寫成 Demo demo=default。

多類型參數(shù)

前面我們所講的都是單個類型參數(shù)的泛型類,但是泛型類型不僅僅只能具有一個參數(shù),它可以具有無限多的參數(shù),例如我們定義一個泛型類,它的構(gòu)造函數(shù)接受兩個不同類型的參數(shù),代碼可以這么實現(xiàn)。

  1. public class Demo() 
  2. public TKey key {get;set;} 
  3. public TValue value {get;set;} 
  4. public Demo(TKey tKey,TValue tValue) 
  5. key=tKey; 
  6. value=tValue; 

我們在使用 Demo 時,只需要聲明和實例化語句尖括號中指定的多個類型參數(shù)即可。在調(diào)用時要提供和方法參數(shù)匹配的類型。

  1. Demo demo=new Demo(1,"小明");  
  2. Console.Write($"編號 {demo.key} 是 {demo.value}"

Tip:在 C# 中在同一個命名空間中可以存在多個同名但類型參數(shù)數(shù)量不同的類。在部分文章或圖書中會將類型參數(shù)數(shù)量稱為 元數(shù) 。

嵌套泛型類型

嵌套泛型類型在開發(fā)中用的比較少,但是還是有必要在這里說一下,因為有部分開發(fā)人員對于這一塊不甚了解。嵌套泛型類型的外層也是一個泛型類型,外層的這個泛型類型通常被稱為包容泛型類型,嵌套泛型類型會自動獲得包容泛型類型的類型參數(shù),這段話有些繞口,我詳細講解一下。

例如 A 是包容泛型類型,它有一個類型參數(shù) T,B 是嵌套泛型類型,它位于 A 中,那么 B 也可以使用 A 的類型參數(shù) T ,如果 B 中也包含一個類型參數(shù) T ,那么 B 會隱藏 A 的類型參數(shù) T 。這里需要提醒的是如果嵌套泛型類型的類型參數(shù)和包容泛型類型的類型參數(shù)相同,那么開發(fā)工具將會出現(xiàn)編譯警告,這個警告是在告知開發(fā)人員使用了相同的類型參數(shù),因此這里就引出一條編碼規(guī)則:避免在嵌套泛型類型中使用同名參數(shù)隱藏外層類型的類型參數(shù)。

泛型方法

前面我們所說的都是泛型類,在 C# 中除了有泛型類還有泛型方法,泛型方法的語法和泛型類的語法類似,并且泛型方法不僅可以出現(xiàn)在泛型類中也可以出現(xiàn)在普通類中。泛型方法和泛型類相比有一個很特別的地方,就是泛型方法可以自己推斷類型。編譯器可以根據(jù)傳給方法的實參來推斷泛型參數(shù)類型。因此如果想讓方法類型推斷成功,那么實參類型必須與泛型方法的形參相匹配。

三、泛型約束

在開發(fā)中大部分情況,我們不允許任何不符合我們要求的類型參數(shù)出現(xiàn)在我們的代碼中并引起錯誤。要杜絕這個問題就需要用到泛型約束。聲明泛型約束需要使用 where 關(guān)鍵字,后面跟一對 參數(shù):要求 。這里面的參數(shù)必須是泛型類型中聲明的一個參數(shù),要求描述的是類型參數(shù)所能轉(zhuǎn)換成的類或接口等條件。泛型約束分為:接口約束、類類型約束、class 和 struct 約束、多約束以及構(gòu)造函數(shù)約束。下面我們就來一一講解一下。

接口約束

為規(guī)定某個數(shù)據(jù)類型必須是向某個接口,需要聲明一個 接口類型約束 ,利用這種約束可以避免需要通過轉(zhuǎn)型才能調(diào)用一個顯示接口成員的實現(xiàn)。下面我們通過一個代碼段來講解一下接口約束。

  1. public class Demo where T:System.IComparable  
  2.  
  3. //more code  

在上面這段代碼中,我們添加了 System.IComparable 約束,也就是說所提供的類型參數(shù)都必須實現(xiàn) System.IComparable 接口。那么當我們向 Demo 傳遞 StringBuilder 作為類型參數(shù)來創(chuàng)建 Demo 變量時編譯器會報告一個錯誤,這是因為 StringBuilder 沒有實現(xiàn) IComparable 接口。

類類型約束

當我們需要將類型實參轉(zhuǎn)換為特定的類類型時就需要用到 類類型約束。類類型約束的語法和接口約束語法相同。這里有一點需要注意,如果同時指定了多種約束,那么類類型約束必須位于第一位(第一個出現(xiàn)),并且泛型約束中是不允許使用多個類類型約束的,這是因為我們的代碼不可能從多個不想管的類中派生出來,同樣類類型約束也不能指定密封類或者不是類的類型。

class、struct 約束

class 和 struct 約束是一個很容易出錯并且也很容易讓新手程序員造成困惑的地方。首先很多新手程序員看到 class 約束會認為是將類型實參限制為類類型,其實不是這樣的。class 約束是類型實參為引用類型,因此這里使用接口、類、委托以技術(shù)組類型都符合這個條件。struct 約束和 class 約束正好相反,它是將類型實參限制為值類型,并且值類型還不能是可空值類型。因為可空值類型是作為泛型 NUllable 來實現(xiàn)的,并且 NUllable 中的 T 使用的是 struct 約束。如果可以使用可控制類型那么 NUllable 就有很大的可能被用成 NUllable

Tip:因為 class 約束要求引用類型而 struct 約束要求值類型,因此這兩種約束是不能同時出現(xiàn)的。

多約束

我們可以為任意類型的參數(shù)指定任意數(shù)量的接口約束,所有的接口約束需要用逗號分割。如果存在多個不同類型的約束,針對每種約束都需要寫一個 where 關(guān)鍵字,不同種類約束之間不需要用任何符號分割。我們來看一下多約束的代碼段:

  1. public class Demo  
  2. where TKey:IA,IB  
  3. where TValue: ClassA  
  4.  
  5. //more code  

構(gòu)造函數(shù)約束

有時我們需要在泛型類中創(chuàng)建類型實參的實例,這時我們可以規(guī)定傳入泛型類的類型實參必須具有構(gòu)造函數(shù),如果要實現(xiàn)這一點我們可以使用new() 來作為限制,這個約束叫做 構(gòu)造函數(shù)約束 。這里需要注意的是構(gòu)造函數(shù)約束必須位于所有約束的后面,并且它只能對默認構(gòu)造函數(shù)進行約束,而不能對有參構(gòu)造函數(shù)進行約束。

Tip 1:關(guān)于約束繼承這個問題,想必好多開發(fā)人員都是一頭霧水。在這里我通過簡單的幾句來說一下約束繼承。首先無論是泛型類型參數(shù)還是它們的約束都不會被 派生類 繼承,這是因為泛型類型參數(shù)和約束不是類的成員。雖然不能被派生類繼承,但是可以被從其派生的泛型類所繼承。由于派生的泛型類類型參數(shù)是泛型基類的類型實參,所以類型參數(shù)必須具有等同于或者強于泛型基類的約束條件。

Tip 2:泛型方法同樣也可以使用約束,約束條件和泛型類類似。

六、總結(jié)

這篇文章我主要講解了泛型的一些知識,不能說很全面,但已經(jīng)覆蓋了百分之九十的內(nèi)容。泛型在開發(fā)中可以說是經(jīng)常用到,良好的使用泛型可以提高代碼復(fù)用率以及程序的運行性能。

作者介紹

朱鋼,筆名喵叔,國內(nèi)知名技術(shù)社區(qū)博客認證專家,2019年知名技術(shù)社區(qū)博客之星20強,.NET高級開發(fā)工程師,7年一線開發(fā)經(jīng)驗,參與過電子政務(wù)系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構(gòu)設(shè)計,目前就職于一家初創(chuàng)公司,從事企業(yè)級安全監(jiān)控系統(tǒng)的開發(fā)。

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關(guān)推薦

2023-11-20 13:51:00

泛型函數(shù)TypeScript

2022-06-14 09:01:06

TypeScript泛型

2021-08-13 05:50:01

ContainerdDockerKubernetes

2019-03-27 09:33:01

Redis性能特性

2019-09-23 10:51:14

JavaJava虛擬機Linux

2024-01-09 08:24:47

JMM核心線程

2021-10-25 16:01:01

Linux設(shè)備樹字符串

2021-03-28 18:40:02

LinuxWindowsJava

2020-10-29 08:55:04

微服務(wù)

2021-10-06 20:23:08

Linux共享內(nèi)存

2022-06-10 09:04:24

Python讀取文件代碼

2023-10-30 18:08:50

2025-08-08 01:11:00

React組件通信

2021-08-31 07:02:20

Diff算法DOM

2022-08-17 18:25:37

Java分布式搜索引擎

2024-08-08 14:57:32

2025-04-07 08:20:00

ORMPython代碼

2021-04-02 06:17:10

大數(shù)加減乘除數(shù)據(jù)結(jié)構(gòu)算法

2022-10-27 07:21:47

Linux性能頻率

2023-05-20 17:58:31

低代碼軟件
點贊
收藏

51CTO技術(shù)棧公眾號

高潮毛片在线观看| 超碰免费在线公开| 亚洲图片小说在线| 在线观看国产高清视频| 日韩精品中文字幕第1页| 久久久国产精品一区二区中文| 午夜精品美女自拍福到在线| 美女高潮在线观看| 91国产免费看| 中文字幕网站视频在线| 丁香在线视频| 一区二区三区免费看视频| 亚洲一区二区高清视频| 中文在线日韩| 国产精品永久在线| 日本精品影院| 欧美国产视频一区二区| 日韩三级一区| 久久久久久久久久久久久久久99| 麻豆视频观看网址久久| 精品国产一区二区三| 亚洲精品久久| 在线视频欧美区| 天堂av免费观看| 国产中文字幕一区二区三区| 在线看欧美日韩| 亚洲综合在线网站| 99re热精品视频| 色播久久人人爽人人爽人人片视av| www婷婷av久久久影片| 国产欧美短视频| 国产伦精品一区二区三区| 欧美激情aⅴ一区二区三区| 99在线热播| 免播放器亚洲| 中文字幕av导航| 国产一本一道久久香蕉| 日韩亚洲欧美中文高清在线| 日韩中文影院| 日日噜噜噜夜夜爽亚洲精品 | 日韩一区二区电影在线观看| 久久aⅴ乱码一区二区三区| 日本一区二区三区视频在线播放| 日韩中文字幕亚洲一区二区va在线 | jizzjizzjizz亚洲日本| 伊人久久大香线蕉精品组织观看| 91免费人成网站在线观看18| 欧美日韩理论| 91嫩草在线| 狠狠色综合日日| 国产亚洲精品超碰| 日本伊人精品一区二区三区介绍| 官网99热精品| 欧美色片在线观看| 国产亚洲综合在线| 欧美午夜精品久久久久久孕妇| 亚洲天堂第一区| 成人在线观看免费网站| 天天操天天干天天综合网| 欧美大尺度做爰床戏| 久久久成人av毛片免费观看| 日韩在线视频国产| 亚欧洲精品视频在线观看| 欧美激情三级免费| 在线精品小视频| 欧美一二区在线观看| 色久优优欧美色久优优| 日韩精品最新在线观看| 日韩欧美三区| 亚洲天堂第一页| 好看不卡的中文字幕| 亚洲欧美亚洲| 亚洲一区不卡在线| 久久亚洲精品国产精品紫薇| 在线看你懂得| 在线日韩日本国产亚洲| 自拍视频一区| 91香蕉视频网址| 亚洲资源中文字幕| 国产网红女主播精品视频| 亚洲精品有码在线| 久久在线观看| 成人欧美一区二区三区在线观看| 免费黄网站欧美| 成年人免费在线播放| 一区二区三区四区不卡在线| 在线免费观看黄| 亚洲人av在线影院| 日韩系列在线| 日韩大片免费观看视频播放| 久久国产精品国产精品| 亚洲精品免费在线观看| 伊人成综合网站| 欧美性xxxxxxxxx| gogo久久| 2019av中文字幕| 亚洲国产成人二区| 奇米影视亚洲狠狠色| 成人3d动漫在线观看| 亚洲激情图片| 亚洲男人天堂av| 91av久久| 国产成人精品最新| 毛片免费看不卡网站| 欧美一级片在线播放| 国产欧美日韩一区二区三区在线| 免费网站永久免费观看| 欧美国产三级| 成人午夜视频在线观看免费| 亚洲成a人片在线观看中文| a日韩av网址| 1卡2卡3卡精品视频| 2014亚洲片线观看视频免费| 91在线播放网站| 日韩美女av在线免费观看| 麻豆精品一区二区三区| 男女视频网站免费观看| 亚洲欧美日韩精品久久| 亚洲人成电影在线观看天堂色| 亚洲精品小区久久久久久| 在线免费观看一区二区三区| 中文av一区| 成人亚洲视频在线观看| 一个色综合导航| 亚洲免费婷婷| 在线91av| 欧美在线综合| 黄色大片中文字幕| 午夜视频一区在线观看| 另类在线视频| 欧美大尺度激情区在线播放| 欧美日本一区二区高清播放视频| 国产911网站| 日日噜噜夜夜狠狠视频欧美人 | 久久中文久久字幕| 日韩视频一区| 在线中文字幕资源| 欧美人在线视频| 精品在线免费观看| 正在播放国产精品| 婷婷六月综合亚洲| 国产精品一区二区三区四区在线观看| 亚洲成人在线视频网站| 欧美午夜宅男影院| 亚洲欧美亚洲| 国产精品一级伦理| 91精品天堂| 日韩欧美中文在线| 日韩一区二区在线| 国产美女免费观看| 91精品久久久久久久| 99久久九九| 欧美h版电影| 欧美在线一级va免费观看| 亚洲欧洲无码一区二区三区| 在线免费观看av的网站| 精品国产一区久久久| 在线午夜精品自拍| 亚洲高清免费观看| 日韩激情av在线| 成人中文字幕视频| 久久精品国产亚洲| 久久久国产视频| 伊人久久青草| 少妇高潮喷水在线观看| 九九99久久| 亚洲国产精品久久久久秋霞不卡| 精品视频一区二区在线| 国产原创欧美精品| 日韩精品一区二区三区在线| 久久国产剧场电影| 欧美片第1页综合| 麻豆蜜桃在线观看| 一区二区三区不卡在线视频 | 杨幂一区二区三区免费看视频| 天堂中文字幕| 婷婷五月色综合| 51成人做爰www免费看网站| 亚洲影院在线| 成人高潮aa毛片免费| 亚洲精品美女免费| 亚洲第一成年网| 成人sese在线| 波多野结衣av一区二区全免费观看| 亚洲无亚洲人成网站77777| 亚洲黄色av一区| 亚洲成av人片在线观看| 99久久夜色精品国产亚洲1000部| 888av在线视频| 最新在线地址| 高清av免费看| 亚洲精品高清视频| 日本一区二区不卡| 欧美黄色免费网站| 亚洲天堂男人天堂| 国产在线视频福利| 无码少妇一区二区三区芒果| 欧美高清一级大片| 日韩欧美综合在线| 深夜成人影院|