日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

[翻译] C# 3.0语言规范 收藏

發布時間:2023/12/18 C# 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [翻译] C# 3.0语言规范 收藏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? [翻譯] C# 3.0語言規范 收藏
http://lover_p.cstc.net.cn/lover_P/doc/t-csharp3/
1 具有隱式類型的局部變量
2 擴展方法
2.1 聲明擴展方法
2.2 導入擴展方法
2.3 擴展方法的調用
3 拉姆達表達式
3.1 拉姆達表達式轉換
3.2 類型推斷
3.3 重載抉擇
4 對象和集合初始化器
4.1 對象初始化器
4.2 集合初始化器
5 匿名類型
6 具有隱式類型的數組
7 查詢表達式
7.1 查詢表達式的翻譯
7.1.1 where子句
7.1.2 select子句
7.1.3 group子句
7.1.4 orderby子句
7.1.5 多重生成器
7.1.6 into子句
7.2 查詢表達式模式
7.3 正式的翻譯規則
8 表達式樹

--------------------------------------------------------------------------------

  C# 3.0(C# Orcas——魔鬼)在C# 2.0的基礎上引入了很多語言擴展,用以支持高級別的函數式風格類庫的創建和使用。這些擴展使得結構性API構造具有與其他領域(如關系數據庫和XML)中查詢語言同等的表達能力。這些擴展包括:

具有隱式類型的局部變量,允許通過用于初始化的表達式來推斷局部變量的類型。
擴展方法,使得對一個現存類型的擴展和構造具有附加方法的類型變為現實。
拉姆達(Lambda)表達式,匿名方法的一種進化,為委托類型和表達式樹提供了改進的類型推斷和轉換。
對象初始化器,使得構造和初始化對象變得容易。
匿名類型,由對象初始化器推斷和創建出來的類型。
具有隱式類型的數組,從數組初始化器推斷出元素類型并進行創建和初始化的數組。
查詢表達式,提供了集成的查詢語法,與關系、分級查詢語言如SQL和XQuery類似。
表達式樹,允許將拉姆達表達式表現為數據(表達式樹),而不是代碼(委托)。
【回頂端】

1 具有隱式類型的局部變量
  在一個具有隱式類型的局部變量聲明(implicitly typed local variable declaration)中,被聲明的局部變量的類型是通過初始化該變量的表達式推斷出來的。當使用局部變量聲指示符符var來代替類型,并且當前作用域內沒有名為var的類型時,這個聲明便成為一個具有隱式類型的局部變量聲明。例如:

var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary<int, Order>();

  上面這些具有隱式類型的局部變量聲明和下面這些具有顯式類型的聲明完全一致:

int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary<int, Order> orders = new Dictionary<int, Order>();

  一個具有隱式類型的局部變量聲明中的局部變量聲明器(Declarator)必須遵循下列約束:

該聲明器必須包含初始化器。
初始化器必須是一個表達式。該初始化器不能是它自己的對象或集合初始化器(第4部分),但可以是一個包含了對象或集合初始化器的new表達式。
初始化器表達式在編譯期的類型必須不能為空類型。
如果局部變量的聲明包含多個聲明器,所有的初始化器在編譯期都必須具有相同的類型。
  下面是不正確的具有隱式類型的局部變量聲明示例:

var x; // 錯誤,沒有用來推斷類型的初始化器
var y = {1, 2, 3}; // 錯誤,不允許使用集合初始化器
var z = null; // 錯誤,不允許出現空類型

  出于向下兼容的原因,當一個局部變量聲明指示符以var作為類型,但當前作用域中有一個名為var的類型時,這個聲明使用的是該類型;然而,(編譯器)會針對這種模糊的語義給出一個警告。不過由于var違反了類型名字首字母必須大寫這條約定,這種情況應該不大會出現。

  for語句的for-initializer和using語句的resource-acquisition可以是一個具有隱式類型的局部變量聲明。同樣,foreach語句中的迭代變量也可以被聲明為具有隱式類型的局部變量,在這種情況下,迭代變量的類型通過待遍歷的集合的元素類型來推斷。

int[] numbers = {1, 3, 5, 7, 9};
foreach(var n in numbers) Console.WriteLine(n);

  在上面的例子中n的類型被推斷為int——numbers的元素類型。

【回頂端】

2 擴展方法
  擴展方法(Extension Method)是一種靜態方法,可以通過實例方法的語法進行調用。從最終效果上看,擴展方法使得擴展一個現有類型和構造一個具有附加方法的類型變成了現實。

注意
  擴展方法很難發覺,并且比起實例方法在功能性上有很大限制。出于這些原因,我們建議保守地使用擴展方法,僅在實例方法不大可行或根本不可行的時候才使用。
  擴展成員的其他類型,如屬性、事件和運算符都在考慮之中,但目前并未支持。

【回頂端】

2.1 聲明擴展方法
  擴展方法通過在方法的第一個參數上指定關鍵字this作為一個修飾符來聲明。擴展方法只能聲明在靜態類中。下面的示例是一個聲明了兩個擴展方法的靜態類:

namespace Acme.Utilities
{
??? public static class Extensions
??? {
??????? public static int ToInt32(this string s)
??????? {
??????????? return Int32.Parse(s);
??????? }

??????? public static T[] Slice<T>(this T[] source, int index, int count)
??????? {
??????????? if(index < 0 || count < 0 || source.Length - index < count)
??????????????? throw new ArugmentException();
??????????? T[] result = new T[count];
??????????? Array.Copy(source, index, result, 0, count);
??????????? return result;
??????? }
??? }
}

  擴展方法和正常的靜態方法具有完全相同的功能。另外,一旦導入了擴展方法,就可以用調用實例方法的語法來調用擴展方法。

【回頂端】

2.2 導入擴展方法
  擴展方法使用using-namespace-directives導入。除了導入一個命名空間中的類型以外,一個using-namespace-directive還可以導入一個命名空間中所有的靜態類中所有的擴展方法。最后,導入的擴展方法表現為其第一個參數的類型的附加方法,并且其優先級比一般的實例方法低。例如,當使用using-namespace-directive導入了上面例子中的Acme.Utilities命名空間時:

using Acme.Utilities;

  就可以使用調用實例方法的語法來調用靜態類Extensions中的擴展方法了:

string s = "1234";
int i = s.ToInt32(); // 和Extensions.ToInt32(s)一樣
int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] a = digits.Slice(4, 3); // 和Extensions.Slice(digits, 4, 3)一樣

【回頂端】

2.3 擴展方法的調用
  下面描述了擴展方法調用的詳細規則。在下面這些形式的方法調用中:

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

  如果按照正常的過程沒有發現可用的實例方法(確切地說,當待調用的候選方法集合為空時),就會嘗試構造一個擴展方法調用。這些方法調用首先被重寫為下面相應的形式:

identifier ( expr )
identifier ( expr , args )
identifier < typeargs > ( expr )
identifier < typeargs > ( expr , args )

  然后將重寫后的形式作為一個靜態方法調用進行處理,identifier按照下列順序進行解析:首先是命名空間生命中最接近的聲明,然后是每一個接近的命名空間,最后是包含這些代碼的編譯單元,其間不斷嘗試重寫過的方法調用,這些方法來自一個方法組,該組由using-namespace-directives導入的命名空間中所有可見的identifier所提供的可見的擴展方法構成。第一個產生了非空候選方法集合的方法組是對沖洗過的方法調用的一個選擇。如果所有的嘗試都產生了空的候選方法集合,就會出現一個編譯期錯誤。

  上述規則意味著實例方法的優先級勝于擴展方法,并且最后引入的命名空間中的擴展方法的優先級勝于較先引入的命名空間中的擴展方法。例如:

using N1;
namespace N1
{
??? public static class E
??? {
??????? public static void F(this object obj, int i) { }
??????? public static void F(this object obj, string s) { }
??? }
}

class A { }

class B
{
??? public void F(int i) { }
}

class C
{
??? public void F(object obj) { }
}

class X
{
??? static void Test(A a, B b, C c)
??? {
??????? a.F(1); // E.F(object, int)
??????? a.F("Hello"); // E.F(object, string)

??????? b.F(1); // B.F(int)
??????? b.F("Hello"); // E.F(object, string)

??????? c.F(1); // C.F(object)
??????? c.F("Hello"); // C.F(object)
??? }
}

  在這個例子中,B的方法優先于第一個擴展方法,而C的方法優先于所有兩個擴展方法。

【回頂端】

3 拉姆達表達式
  C# 2.0中引入了匿名方法,允許在期望出現委托的時候以“內聯(in-line)”的代碼替代之。盡管匿名方法提供了函數式編程語言中的很多表達能力,但匿名方法的語法實在是太羅嗦了,并且很不自然。拉姆達表達式(Lambda expression)為書寫匿名方法提供了一種更加簡單、更加函數化的語法。

  拉姆達表達式的書寫方式是一個參數列表后跟=>記號,然后跟一個表達式或一個語句塊。

expression:
??? assignment
??? non-assignment-expression

non-assignment-expression:
??? conditional-expression
??? lambda-expression
??? query-expression

lambda-expression:
??? ( lambda-parameter-listopt ) => lambda-expression-body
??? implicitly-typed-lambda-parameter => lambda-expression-body

lambda-parameter-list:
??? explicitly-typed-lambda-parameter-list
??? implicitly-typed-lambda-parameter-list

explicitly-typed-lambda-parameter-list:
??? explicitly-typed-lambda-parameter
??? explicitly-typed-lambda-parameter-list , explicitly-typed-lambda-parameter

explicitly-typed-lambda-parameter:
??? parameter-modifieropt type identifier

implicitly-typed-lambda-parameter-list:
??? implicitly-typed-lambda-parameter
??? implicitly-typed-lambda-parameter-list , implicitly-typed-lambda-parameter

implicitly-typed-lambda-parameter:
??? identifier

lambda-expression-body:
??? expression
??? block

  拉姆達表達式的參數可以具有顯式的或隱式的類型。在一個具有顯式類型的參數列表中,每個參數的類型都是顯式聲明的。在一個具有隱式類型的參數列表中,參數的類型是從拉姆達表達式出現的上下文中推斷出來的——具體來說,是當拉姆達表達式被轉換為一個兼容的委托類型時,該委托類型提供了參數的類型。

  當拉姆達表達式只有一個具有隱式類型的參數時,參數列表中的括號可以省略。換句話說,下面這種形式的拉姆達表達式:

( param ) => expr

  可以簡寫為:

param => expr

  下面給出的是拉姆達表達式的一些例子:

x => x + 1? // 隱式類型,以表達式作為拉姆達表達式體
x => { return x + 1; }? // 顯式類型,以語句塊作為拉姆達表達式體
(int x) => x + 1? // 顯式類型,以表達式作為拉姆達表達式體
(int x) => { return x + 1; }? // 顯式類型,以語句塊作為拉姆達表達式體
(x, y) => x * y? // 多個參數
() => Console.WriteLine()? // 沒有參數

  通常,C# 2.0規范中提到的匿名方法規范同樣適用于拉姆達表達式。拉姆達表達式是匿名方法在功能行上的超集,提供了下列附加的功能:

拉姆達表達式允許省略參數類型并對其進行推斷,而匿名方法要求參數類型必須顯式地聲明。
拉姆達表達式體可以是表達式或語句塊,而匿名方法體只能是語句塊。
在類型參數推導和方法重載抉擇時,拉姆達表達式可以被作為參數傳遞。
以一個表達式作為表達式體的拉姆達表達式可以被轉換為表達式樹。
注意
  PDC 2005技術預覽版編譯器并不支持以一個語句塊作為表達式體的拉姆達表達式。當必需一個語句塊時,請使用C# 2.0中的匿名方法語法。

【回頂端】

3.1 拉姆達表達式轉換
  和匿名方法表達式類似,拉姆達表達式可以歸類為一種擁有特定轉換規則的值。這種值沒有類型,但可以被隱式地轉換為一個兼容的委托類型。特別地,當滿足下列條件時,委托類型D兼容于拉姆達表達式L:

D和L具有相同數量的參數。
如果L具有顯式類型的參數列表,D中每個參數的類型和修飾符必須和L中相應的參數完全一致。
如果L具有隱式類型的參數列表,則D中不能有ref或out參數。
如果D具有void返回值類型,并且L的表達式體是一個表達式,若L的每個參數的類型與D的參數一致,則L的表達式體必須是一個可接受為statement-expression的有效表達式。
如果D具有void返回值類型,并且L的表達式體是一個語句塊,若L的每個參數的類型與D的參數一致,則L的表達式體必須是一個有效語句塊,并且該語句塊中不能有帶有表達式的return語句。
如果D的返回值類型不是void,并且L的表達式體是一個表達式,若L的每個參數的類型與D的參數一致,則L的表達式體必須是一個可以隱式轉換為D的返回值類型的有效表達式。
如果D的返回值類型不是void,并且L的表達式體是一個語句塊,若L的每個參數的類型與D的參數一致,則L的表達式體必須是一個有效的語句塊,該語句塊不能有可達的終點(即必須有return語句,譯者注),并且每個return語句中的表達式都必須能夠隱式轉換為D的返回值類型。
  后面的例子將使用一個范型委托Func<A, R>,表示一個函數,它具有一個類型為A的參數,返回值類型為R:

delegate R Func<A, R>(A arg);

  在下面的賦值中:

Func<int, int> f1 = x => x + 1;? // Ok
Func<int, double> f2 = x => x + 1;? // Ok
Func<double, int> f3 = x => x + 1;? // Error

  每個拉姆達表達式的參數和返回值類型通過將拉姆達達表達式賦給的變量的類型來檢測。第一個賦值將拉姆達表達式成功地轉換為了委托類型Func<int, int>,因為x的類型是int,x + 1是一個有效的表達式,并且可以被隱式地轉換為int。同樣,第二個賦值成功地將拉姆達表達式轉換為了委托類型Func<int, double>,因為x + 1的結果(類型為int)可以被隱式地轉換為double類型。然而,第三個賦值將會產生一個編譯期錯誤,因為x給定的類型是double,x + 1的結果(類型為double)不能被隱式地轉換為int。

【回頂端】

3.2 類型推斷
  當在沒有指定類型參數的情況下調用一個范型方法時,一個類型推斷過程回去嘗試為該調用推斷類型參數。被作為參數傳遞給范型方法的拉姆達表達式也會參與這個類型推斷過程。

  最先發生的類型推斷獨立于所有參數。在這個初始階段,不會從作為參數的拉姆達表達式推斷出任何東西。然而,在初始階段之后,將通過一個迭代過程從拉姆達表達式進行推斷。特別地,當下列條件之一為真時將會完成推斷:

參數是一個拉姆達表達式,以后簡稱為L,從其中未得到任何推斷。
相應參數的類型,以后簡稱為P,是一個委托類型,其返回值類型包括了一個或多個方法類型參數。
P和L具有相同數量的參數,P中每個參數的修飾符與L中相應的參數一致,或者如果L具有隱式類型的參數列表時,沒有參數修飾符。
P的參數類型不包含方法類型參數,或僅包含于已經推斷出來的類型參數相兼容的一組類型參數。
如果L具有顯式類型的參數列表,當推斷出來的類型被P中的方法類型參數取代了時,P中的每個參數應該具有和L中相應參數一致的類型。
如果L具有隱式類型的參數列表,當推斷出來的類型被P中的方法類型參數取代了并且作為結果的參數類型賦給了L時,L的表達式體必須是一個有效的表達式或語句塊。
可以為L推斷一個返回值類型。這將在后面描述。
  對于每一個這樣的參數,都是通過關聯P的返回值類型和從L推斷出的返回值類型來從其上進行推斷的,并且新的推斷將被添加到累積的推斷集合中。這個過程一直重復,直到無法進行更多的推斷為止。

  在類型推斷和重載抉擇中,拉姆達表達式L的“推斷出來的返回值類型”通過以下步驟進行檢測:

如果L的表達式體是一個表達式,則該表達式的類型就是L的推斷出來的返回值類型。
如果L的表達式體是一個語句塊,若由該塊中的return語句中的表達式的類型形成的集合中恰好包含一個類型,使得該集合中的每個類型都能隱式地轉換為該類型,并且該類型不是一個空類型,則該類型即是L的推斷出來的返回值類型。
除此之外,無法從L推斷出一個返回值類型。
  作為包含了拉姆達表達式的類型推斷的例子,請考慮System.Query.Sequence類中聲明的Select擴展方法:

namespace System.Query
{
??? public static class Sequence
??? {
??????? public static IEnumerable<S> Select<T, S>(
??????????? this IEnumerable<T> source,
??????????? Func<T, S> selector)
??????? {
??????????? foreach(T element in source) yield return selector(element);
??????? }
??? }
}

  假設使用using語句導入了System.Query命名空間,并且定義了一個Customer類,具有一個類型為string的屬性Name,Select方法可以用于從一個Customer列表中選擇名字:

List<Customer> customers = GetCustomerList();
IEnumerable<string> names = customers.Select(c => c.Name);

  對擴展方法Select的調用將被處理為一個靜態方法調用:

IEnumerable<string> names = Sequence.Select(customers, c => c.Name);

  由于沒有顯式地指定類型參數,將通過類型推斷來推導類型參數。首先,customers參數被關聯到source參數,T被推斷為Customer。然后運用上面提到的拉姆達表達式類型推斷過程,C的類型是Customer,表達式c.Name將被關聯到selector參數的返回值類型,因此推斷S是string。因此,這個調用等價于:

Sequence.Select<Customer, string>(customers, (Customer c) => c.Name)

  并且其返回值類型為IEnumerable<string>。

  下面的例子演示了拉姆達表達式的類型推斷是如何允許類型信息在一個范型方法調用的參數之間“流動”的。對于給定的方法:

static Z F<X, Y, Z>(X value, Func<X, Y> f1, Func<Y, Z> f2)
{
??? return f2(f1(value));
}

  下面這個調用:

double seconds = F("1:15:30", s => TimeSpan.Parse(s), t => TotalSeconds);

  的類型推斷過程是這樣的:首先,參數"1:15:30"被關聯到value參數,推斷X為string。然后,第一個拉姆達表達式的參數s具有推斷出來的類型string,表達式TimeSpan.Parse(s)被關聯到f1的返回值類型,推斷Y是System.TimeSpan。最后,第二個拉姆達表達式的參數t具有推斷出來的類型System.TimeSpan,并且表達式t.TotalSeconds被關聯到f2的返回值類型,推斷Z為double。因此這個調用的結果類型是double。

【回頂端】

3.3 重載抉擇
  參數列表中的拉姆達表達式將影響到特定情形下的重載抉擇(也稱重載分析,重載解析等,即從幾個重載方法中選擇最合適的方法進行調用的過程,譯者注)。

  下面是新添加的規則:對于拉姆達表達式L,且其具有推斷出來的返回值類型,當委托類型D1和委托類型D2具有完全相同的參數列表,并且將L的推斷出來的返回值類型隱式轉換為D1的返回值類型要優于將L的推斷出來的返回值類型隱式轉換為D2的返回值類型時,稱L到D1的隱式轉換優于L到D2的隱式轉換。如果這些條件都不為真,則兩個轉換都不是最優的。

  下面的例子講解了這一規則。

class ItemList<T> : List<T>
{
??? public int Sum<T>(Func<T, int> selector)
??? {
??????? int sum = 0;
??????? foreach(T item in this) sum += selector(item);
??????? return sum;
??? }

??? public double Sum<T>(Func<T, double> selector)
??? {
??????? double sum = 0;
??????? foreach(T item in this) sum += selector(item);
??????? return sum;
??? }
}

  ItemList<T>有兩個Sum方法。每個都帶有一個selector參數,用于從列表項目中依次選取值進行求和。選擇的值或者是int或者是double,結果也相應的是int或double。

  可以使用Sum方法來根據一份產品明細表對一個訂單進行求和:

class Detail
{
??? public int UnitCount;
??? public double UnitPrice;
??? ...
}

void ComputeSums()
{
??? ItemList<Detail> orderDetails = GetOrderDetails(...);
??? int totalUnits = orderDetails.Sum(d => d.UnitCount);
??? double orderTotal = orderDetails.Sum(d => d.UnitPrice * d.UnitCount);
??? ...
}

  在對orderDetails.Sum的第一個調用中,兩個Sum方法都是可以的,因為拉姆達表達式d => d.UnitCount與Func<Detail, int>和Func<Detail, double>都兼容。然而,重載抉擇選用了第一個Sum方法,因為轉換到Func<Detail, int>要優于轉換到Func<Detail, double>。

  在對orderDetails.Sum的第二個調用中,只有第二個Sum方法是可用的,因為拉姆達表達式d => d.UnitPrice * d.UnitCount產生的值的類型是double。因此重載抉擇選用第二個Sum方法進行調用。

【回頂端】

4 對象和集合初始化器
  一個對象創建表達式可以包含一個對象或集合初始化器,用于初始化新創建的對象的成員或新創建的集合的元素。

object-creation-expression:
??? new type ( argument-listopt ) object-or-collection-initializeropt
??? new type object-or-collection-initializer

object-or-collection-initializer:
??? object-initializer
??? collection-initializer

  一個對象創建表達式可以省略構造器參數列表,并將其連同圓括號一起替換為一個對象或集合初始化器。省略構造器參數列表并將其連同圓括號一起替換為一個對象或集合初始化器等價于指定一個空的參數列表。

  在執行一個帶有對象或集合初始化器的對象創建表達式時,首先調用實例構造器,然后執行對象或集合初始化器指定的成員或元素初始化。

  對象或集合初始化器不能引用正在初始化的對象實例。

【回頂端】

4.1 對象初始化器
  對象初始化器指定了對象的一個或多個域或屬性的值。

object-initializer:
??? { member-initializer-listopt }
??? { member-initializer-list , }

member-initializer-list:
??? member-initializer
??? member-initializer-list , member-initializer

member-initializer:
??? identifier = initializer-value

initializer-value:
??? expression
??? object-or-collection-initializer

  對象初始化器由一系列的成員初始化器構成,包圍在{和}記號中,并用逗號進行分隔。每個成員初始化器以對象的一個可訪問的域或屬性的名字開始,后跟一個等號,之后是一個表達式或一個對象或集合初始化器。如果對象初始化其中包括了對同一個域或屬性的多于一個的成員初始化器,將會發生錯誤。

  在等號后面指定了表達式的成員初始化器的處理與域和屬性的賦值一致。

  在等號后面指定了對象初始化器的成員初始化器也是對一個嵌套對象的初始化。與為域或屬性賦一個新值不同,對象初始化器中的賦值被視為對域或屬性的成員進行賦值。一個具有值類型的屬性不能通過這種構造來進行初始化。

  在等號后面指定了集合初始化器的成員初始化器也是對一個嵌套集合的初始化。與為域或屬性賦一個新的集合不同,初始化器中給定的元素將被添加到域或屬性所引用的集合中。該域或屬性必須是一個滿足下一節所指定的需求的集合類型。

  下面的類表是一個具有兩個坐標值的點:

public class Point
{
??? int x, y;

??? public int X { get { return x; } set { x = value; } }
??? public int Y { get { return y; } set { y = value; } }
}

  Point的一個實例可以像下面這樣創建和初始化:

var a = new Point { X = 0, Y = 1 };

  其等價于:

var a = new Point();
a.X = 0;
a.Y = 1;

  下面的類表是一個具有兩個點的矩形:

public class Rectangle
{
??? Point p1, p2;

??? public Point P1 { get { return p1; } set { p1 = value; } }
??? public Point P2 { get { return p2; } set { p2 = value; } }
}

  可以像下面這樣創建和初始化一個Rectangle:

var r = new Rectangle
{
??? P1 = new Point { X = 0, Y = 1 },
??? P2 = new Point { X = 2, Y = 3 }
};

  其等價于:

var r = new Rectangle();
var __p1 = new Point();
__p1.X = 0;
__p1.Y = 1;
r.P1 = __p1;
var __p2 = new Point();
__p2.X = 2;
__p2.Y = 3;
r.P2 = __p2;

  其中的__p1和__p2是臨時變量,在其他地方不可見也不可訪問。

  如果Rectangle的構造器分配了兩個嵌套的Point實例:

public class Rectangle
{
??? Point p1 = new Point();
??? Point p2 = new Point();

??? public Point P1 { get { return p1; } }
??? public Point P2 { get { return p2; } }
}

  下面的構造可以用來初始化內嵌的Point實例,而不是為其賦以新值:

var r = new Rectangle
{
??? P1 = { X = 0, Y = 1 },
??? P2 = { X = 2, Y = 3 }
};

  其等價于:

var r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;

【回頂端】

4.2 集合初始化器
  集合初始化器指定了集合的元素。

collection-initializer:
??? { element-initializer-listopt }
??? { element-initializer-list , }

element-initializer-list:
??? element-initializer
??? element-initializer-list , element-initializer

element-initializer:
??? non-assignment-expression

  一個集合初始化器由一系列的元素初始化器構成,包圍在{和}記號之間,并使用逗號進行分隔。每個元素初始化器指定一個元素,該元素將被添加到待初始化的集合對象中。為了避免與成員初始化器混淆,元素初始化器不能是賦值表達式。

  下面是包含了集合初始化器的對象創建表達式的一個例子:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  可以應用集合初始化器的對象的類型必須實現了System.Collections.Generic.ICollections<T>并指定了確定的T。此外,必須存在從每個元素初始化器的類型到T的隱式轉換。如果這些條件不能滿足,就會產生一個編譯期錯誤。集合初始化器將依次對每個指定的元素調用ICollection<T>.Add(T)。

  下面的類表是一個具有一個名字和一組電話號碼的通訊錄:

public class Contact
{
??? string name;
??? List<string> phoneNumbers = new List<string>();

??? public string Name { get { return name; } set { name = value; } }
??? public List<string> PhoneNumbers { get { return phoneNumbers; } }
}

  可以像下面這樣創建和初始化一個List<Contact>:

var contacts = new List<Contact>
{
??? new Contact
??? {
??????? Name = "Chris Smith",
??????? PhoneNumbers = { "206-555-0101", "425-882-8080" }
??? },
??? new Contact
??? {
??????? Name = "Bob Harris",
??????? PhoneNumbers = { "650-555-0199" }
??? }
};

  其等價于:

var contacts = new List<Contact>();
var __c1 = new Contact();
__c1.Name = "Chris Smith";
__c1.PhoneNumbers.Add("206-555-0101");
__c1.PhoneNumbers.Add("425-882-8080");
contacts.Add(__c1);
var __c2 = new Contact();
__c2.Name = "Bob Harris";
__c2.PhoneNumbers.Add("650-555-0199");
contacts.Add(__c2);

  其中__c1和__c2是臨時變量,在其他地方不可見且不可訪問。

【回頂端】

5 匿名類型
  C# 3.0允許將new運算符用于一個匿名對象初始化器來創建一個匿名類型的對象。

primary-no-array-creation-expression:
??? ...
??? anonymous-object-creation-expression

anonymous-object-creation-expression:
??? new anonymous-object-initializer

anonymous-object-initializer:
??? { member-declarator-listopt }
??? { member-declarator-list , }

member-declarator-list:
??? member-declarator
??? member-declarator-list , member-declarator

member-declarator:
??? simple-name
??? member-access
??? identifier = expression

  一個匿名對象初始化器聲明了一個匿名類型并返回了該類型的一個實例。匿名類型是一個沒有名字并且直接繼承自object的類類型。匿名類型的成員是一系列可讀/寫屬性,這些屬性依次通過創建該類型的實例時使用的對象初始化器進行推斷。特殊地,具有下面形式的一個匿名對象初始化器:

new { p1 = e1 , p2 = e2, ... pn = en }

  聲明了一個具有下面形式的匿名類型:

class __Anonymous1
{
??? private T1 f1;
??? private T2 f2;
??? ...
??? private Tn fn;

??? public T1 p1 { get { return f1; } set { f1 = value; } }
??? public T2 p2 { get { return f2; } set { f2 = value; } }
??? ...
??? public Tn pn { get { return fn; } set { fn = value; } }
}

  其中的每個Tx是對應的表達式ex的類型。如果匿名對象初始化器中的某個表達式具有空類型,會發生一個編譯期錯誤。

  匿名類型的名字由編譯器自動生成,并且不能在程序文本中引用。

  在同一個程序中,兩個具有相同名字、相同類型和相同順序的屬性的匿名對象初始化器將產生同一個匿名類型的實例。(這個定義包括了屬性的順序,這是因為在某些環境中順序是可見的而且是非常重要的,比如反射。)

  下面的例子:

var p1 = new { Name = "Lawnmower", Price = 495.00 };
var p2 = new { Name = "Shovel", Price = 26.95 };
p1 = p2;

  其中最后一行中的賦值是允許的,因為p1和p2具有相同的匿名類型。

  一個成員初始化器可以縮寫為一個簡單名字或一個成員訪問。這時稱該成員初始化器為影射初始化器(Projection Initializer),也是對具有相同名字的屬性的聲明和賦值的簡寫。特別地,具有下面形式的成員聲明器:

identifier expr . identifier

  與下面的對應形式完全等價:

identifier = identifier identifier = expr . identifier

  因此,在一個影射初始化器中,identifier同時選擇了所賦的值的值和域或屬性。直觀上看,影射初始化器反映出的不僅僅是一個值,還包括這個值的名字。

【回頂端】

6 具有隱式類型的數組
  數組創建表達式的語法被擴展為支持具有隱式類型的數組創建表達式:

array-creation-expression:
...
new [ ] array-initializer

  在一個具有隱式類型的數組創建表達式中,數組實例的類型通過數組初始化器中指定的元素來推斷。特別地,數組初始化器中的表達式類型形成的集合中,必須恰好有一個類型使得其他類型都可以隱式地轉換為該類型,并且該類型不是空類型,則創建一個具有該類型的數組。如果無法推斷出恰好一個這樣的類型,或者推斷出來的類型是空類型,會發生一個編譯期錯誤。

  下面是具有隱式類型的數組創建表達式的一些例子:

var a = new[] { 1, 10, 100, 1000 }; // int[]
var b = new[] { 1, 1.5, 2, 2.5 }; // double[]
var c = new[] { "hello", null, "world" }; // string[]
var d = new[] { 1, "one", 2, "two" }; // Error

  最后一個表達式會產生一個編譯期錯誤,因為int和string都不能隱式地轉換為另一個。這時就必須使用一個具有顯式類型的數組創建表達式,例如指定其類型為object[]。另一種可選方法是,某個元素可以被轉換為一個通用基本類型,這個類型就將成為推導出的類型。

  具有隱式類型的數組創建表達式可以與匿名對象初始化器合并,來創建匿名類型數據結構。例如:

var contacts = new[]
{
??? new
??? {
??????? Name = "Chris Smith",
??????? PhoneNumbers = new[] { "206-555-0101", "425-882-8080" }
??? },
??? new
??? {
??????? Name = "Bob Harris",
??????? PhoneNumbers = new[] { "650-555-0199" }
??? }
};

【回頂端】

7 查詢表達式
  查詢表達式(Query Expression)為查詢提供了一種語言集成的語法,這種語法類似于關系和分級查詢語言,如SQL和XQuery。

query-expression:
??? from-clause query-body

from-clause:
??? from from-generators

from-generators:
??? from-generator
??? from-generators , from-generator

from-generator:
??? identifier in expression

query-body:
??? from-or-where-clausesopt orderby-caluseopt select-or-group-clause into-clauseopt

from-or-where-clauses:
??? from-or-where-clause
??? from-or-where-clauses from-or-where-clause

from-or-where-clause:
??? from-clause
??? where-clause

where-clause:
??? where boolean-expression

orderby-clause:
??? orderby ordering-clauses

ordering-clauses:
??? ordering-clause
??? ordering-clauses , ordering-clause

ordering-clause:
??? expression ordering-directionopt

ordering-direction:
??? ascending
??? descending

select-or-group-clause:
??? select-clause
??? group-clause

select-clause:
??? selelct expression

group-clause:
??? group expression by expression

into-clause:
??? into identifier query-body

  一個查詢表達式以一個from子句開始,以一個select或group子句結束。起始的from子句后可以跟零個或多個from或where子句。每個from子句都是一個生成器,該生成器引入了一個可以覆蓋整個序列的迭代變量;而每個where子句都是一個過濾器,該過濾器用于從結果中排出項目。最終的select或group子句根據迭代變量來指定結果的表現形式。select或group子句前面還可以有一個orderby子句,用以指定結果的順序。最后,可以用一個into子句通過將一個查詢的結果作為一個子查詢的生成器來“聯結”兩個查詢。

  在查詢表達式中,具有多個生成器的from子句嚴格等價于多個順序的只具有一個生成器的from子句。

【回頂端】

7.1 查詢表達式的翻譯
  C# 3.0語言并沒有為查詢表達式指定確切的執行語義,而是將查詢表達式翻譯為對附著于查詢表達式模式(Query Expression Pattern)的方法的調用。特別地,查詢表達式分別被翻譯為對名為Where、Select、SelectMany、OrderBy、OrderByDescending、ThenBy、ThenByDescending和GroupBy的方法的調用,這些方法有著預期的簽名和返回值類型。這些方法既可以是待查詢對象的實例方法,也可以是對象外部的擴展方法。這些方法進行著實際的查詢工作。

  將查詢表達式翻譯為方法調用的過程是一個語法映射過程,發生在任何類型綁定或重載抉擇的執行之前。翻譯的結果可以保證語法正確,但不一定保證產生語義正確的C#代碼。在查詢表達式翻譯之后,產生的方法調用作為一般的方法調用進行處理,這時會依次發現錯誤,如方法不存在、參數類型錯誤或對一個范型方法的類型推斷失敗等。

  后面的一系列示例依次演示了查詢表達式的翻譯。在后面的某一節中給出了翻譯規則的正式描述。

【回頂端】

7.1.1 where子句
  查詢表達式中的一個where子句:

from c in customers
where c.City == "London"
select c

  將被翻譯為對一個Where方法的調用,其參數為合并了迭代變量和where子句中的表達式所得到的拉姆達表達式:

customers.
Where(c => c.City == "London")

【回頂端】

7.1.2 select子句
  上面的例子演示了選擇了最內部的迭代變量的select子句是如何通過翻譯為方法調用被消除的。

  一個選擇了并非最內部的迭代變量的select子句:

from c in customers
where c.City == "Longdon"
select c.Name

  將被翻譯為一個Select方法調用,其參數是一個拉姆達表達式:

customers.
Where(c => c.City == "London").
Select(c => c.Name)

【回頂端】

7.1.3 group子句
  一個group子句:

from c in customers
group c.Name by c.Country

  將被翻譯為對GroupBy方法的調用:

customers.
GroupBy(c => c.Country, c => c.Name)

【回頂端】

7.1.4 orderby子句
  一個orderby子句:

from c in customers
orderby c.Name
select new { c.Name, c.Phone }

  將被翻譯為一個對OrderBy方法的調用,或者當指定了descending指示符時,被翻譯為一個對OrderByDescending方法的調用:

customers.
OrderBy(c => c.Name).
Select(c => new { c.Name, c.Phone })

  另一個orderby子句:

from c in customers
orderby c.Country, c.Balance descending
select new { c.Name, c.Country, c.Balance }

  將被翻譯為對ThenBy和ThenByDescending方法的調用:

customers.
OrderBy(c => c.Country).
ThenByDescending(c => c.Balance).
Select(c => new { c.Name, c.Country, c.Balance })

【回頂端】

7.1.5 多重生成器
  多重生成器:

from c in customers
where c.City == "London"
from o in c.Orders
where o.OrderDate.Year == 2005
select new { c.Name, o.OrderID, o.Total }

  將被翻譯為對所有非最內部生成器的SelectMany方法調用:

customers.
Where(c => c.City == "London").
SelectMany(c =>
??? c.Orders.
??? Where(o => o.OrderDate.Year == 2005).
??? Select(o => new { c.Name, o.OrderID, o.Total })
)

  當多重生成器被一個orderby子句合并起來:

from c in customers, o in c.Orders
where o.OrderDate.Year == 2005
orderby o.Total descending
select new { c.Name, o.OrderID, o.Total }

  一個附加的Select將被注入,用于收集排序表達式和最終的結果序列。讓OrderBy可以操作整個序列是有必要的。OrderBy之后,最終的結果將被提取出來:

customers.
SelectMany(c =>
??? c.Orders.
??? Where(o => o.OrderDate.Year == 2005).
??? Select(o => new { k1 = o.Total, v = new { c.Name, o.OrderID, o.Total } })
).
OrderByDescending(x => x.k1).
Select(x => x.v)

【回頂端】

7.1.6 into子句
  一個into子句:

from c in customers
group c by c.Country into g
select new { Country = g.Key, CustCount = g.Group.Count() }

  是嵌套查詢的一種很簡單的形式:

from g in
from c in customers
group c by c.Country
select new { Country = g.Key, CustCount = g.Group.Count() }

  將被翻譯為:

customers.
GroupBy(c => c.Country).
Select(g => new { Country = g.Key, CustCount = g.Group.Count() })

【回頂端】

7.2 查詢表達式模式
  查詢表達式模式(Query Expression Pattern)建立了類型可以實現的方法的一套模式,用以支持查詢表達式。因為查詢表達式會被通過語法映射來翻譯為方法調用,因此類型在如何實現其查詢表達式模式上尤為靈活。例如,模式的這些方法可以被實現為實例方法或擴展方法,因為兩者具有完全一樣的調用語法;而方法的參數也可以是委托或表達式樹,因為拉姆達表達式可以轉換為這兩者。

  下面給出了支持查詢表達式模式的范型類型C<T>的推薦形式。范型類型用于演示參數和結果類型之間正確的關系,也可以將模式實現為非范型類型。

delegate R Func<A, R>(A arg);

class C<T>
{
??? public C<T> Where(Func<T, bool> predicate);
??? public C<S> Select<S>(Func<T, S> selector);
??? public C<S> SelectMany<S>(Func<T, C<S>> selector);
??? public O<T> OrderBy<K>(Func<T, K> keyExpr);
??? public O<T> OrderByDescending<K>(Func<T, K> keyExpr);
??? public C<G<K, T>> GroupBy<K>(Func<T, K> keyExpr);
??? public C<G<K, E>> GroupBy<K, E>(Func<T, K> keyExpr, Func<T, E> elemExpr);
}

class O<T> : C<T>
{
??? public O<T> ThenBy<K>(Func<T, K> keySelector);
??? public O<T> ThenByDescending<K>(Func<T, K> keySelector);
}

class G<K, T>
{
??? public K Key { get; }
??? public C<T> Group { get; }
}

  上面的方法是用了一個范型委托類型Func<A, R>,也可以使用等價的其他委托或表達式樹類型,只要參數和結果類型之間存在正確的關系即可。

  注意在推薦的C<T>和O<T>之間的關系中,要保證ThenBy和ThenByDescending方法只能用在OrderBy或OrderByDescending的結果上。同時請注意GroupBy結果的推薦形式,應該是一組具有Key和Group屬性的(匿名類型實例)序列。

  標準查詢運算符(Standard Query Operators,在另外一個規范中描述)提供了查詢表達式的一個實現,這個實現可以用于所有實現了System.Collections.Generic.IEnumerable<T>接口的類型。

【回頂端】

7.3 正式的翻譯規則
  對一個查詢表達式的處理將重復、依次地應用下列翻譯規則。每個翻譯都一直應用這些規則直到不再發生任何給定的模式。

  注意將會產生對OrderBy和ThenBy的調用的翻譯,如果相應的排序子句制定了descending指示符,將產生對OrderByDescending或ThenByDescending的調用。

包含了into子句的查詢:
q1 into x q2

將被翻譯為:

from x in (q1) q2

具有多個生成器的from子句:
from g1, g2, ... gn

將被翻譯為:

from g1 from g2 ... from gn

后面立即跟有where子句的from子句:
from x in e where f

將被翻譯為:

from x in (e).Where(x => f)

具有多個from子句、一個orderby子句和一個select子句的查詢表達式:
from x1 in e1 from x2 in e2 ... orderby k1, k2 ... select v

將被翻譯為:

(from x1 in e1 from x2 in e2 ...
select new { K1 = k1, K2 = k2 ..., V = v })
.OrderBy(x => x.K1).ThenBy(x => x.K2)...
.Select(x => x.V)

具有多個from子句、一個orderby子句和一個group子句的查詢表達式:
from x1 in e1 from x2 in e2 ... orderby k1, k2 ... group v by g

將被翻譯為:

(from x1 in e1 from x2 in e2 ...
select new { K1 = k1, K2 = k2 ..., V = v, G = g })
.OrderBy(x => x.K1).ThenBy(x => x.K2) ...
.GroupBy(x => x.G, x => x.V)

具有多個from子句和一個select子句的查詢表達式:
from x in e from x1 in e1 ... select v

將被翻譯為:

(e).SelectMany(x => from x1 in e1 ... select v)

具有多個from子句和一個group子句的查詢表達式:
from x in e from x1 in e1 ... group v by g

將被翻譯為:

(e).SelectMany(x => from x1 in e1 ... group v by g)

具有一個from子句、沒有orderby子句,并且具有一個select子句的查詢表達式:
from x in e select v

將被翻譯為:

(e).Select(x => v)

當v就是標識符x時,翻譯將被簡化為:

(e)

具有一個from子句、沒有orderby子句,并且具有一個group子句的查詢表達式:
from x in e group v by g

將被翻譯為

(e).GroupBy(x => g, x => v)

當v就是標識符x時,翻譯將被簡化為:

(e).GroupBy(x => g)

具有一個from子句、一個orderby子句和一個select子句的查詢表達式:
from x in e orderby k1, k2 ... select v

將被翻譯為:

(e).OrderBy(x => k1).ThenBy(x => k2) ...
.Select(x => v)

當v就是標識符x時,翻譯將被簡化為:

(e).OrderBy(x => k1).ThenBy(x => k2) ...

具有一個from子句、一個orderby子句和一個group子句的查詢表達式:
from x in e orderby k1, k2 ... group v by g

將被翻譯為:

(e).OrderBy(x => k1).ThenBy(x => k2) ...
.GroupBy(x => g, x => v)

當v就是標識符x時,翻譯將被簡化為:

(e).OrderBy(x => k1).ThenBy(x => k2) ...
.GroupBy(x => g)

【回頂端】

8 表達式樹
  表達式樹允許將拉姆達表達式表現為數據結構而不是可執行代碼。一個可以轉換為委托類型D的拉姆達表達式也可以轉換為一個類型為System.Query.Expression<D>的表達式樹。將一個拉姆達表達式轉換為委托類型導致可執行代碼被委托所生成和引用,而將其轉換為一個表達式樹類型將導致創建了表達式樹實例的代碼被發出(Emit)。表達式樹是拉姆達表達式的一種高效的內存中(in-memory)數據表現形式,并且使得表達式的結構變得透明和明顯。

  下面的例子將一個拉姆達表達式分別表現為了可執行代碼和表達式樹。由于存在到Func<int, int>的轉換,因此存在到Expression<Func<int, int>>的轉換。

Func<int, int> f = x => x + 1; // 代碼
Expression<Func<int, int>> e = x => x + 1; // 數據

  在這些賦值完成之后,委托f表示一個返回x + 1的方法,而表達式樹e表示一個描述了表達式x + 1的數據結構。

注意
  表達式樹的結構將被轉換為一份單獨的規范。該規范在PDC 2005技術預覽版中并不適用。

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/loverP/archive/2005/10/21/511796.aspx

轉載于:https://www.cnblogs.com/leilei03632/articles/1728841.html

總結

以上是生活随笔為你收集整理的[翻译] C# 3.0语言规范 收藏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品一区二区三区免费视频 | av片在线观看免费 | 国产97免费 | 日本少妇高清做爰视频 | 天天夜夜狠狠操 | 国产欧美精品一区二区三区 | 免费h精品视频在线播放 | 在线日韩视频 | 国产视频2| 韩日精品视频 | 日本中文字幕在线免费观看 | 一级一片免费观看 | av手机版| 女人魂免费观看 | 中文字幕日韩国产 | 久久av观看| 亚洲精品一区中文字幕乱码 | 久久免费在线视频 | 99精品国产视频 | 婷婷激情综合 | 亚洲精品免费观看视频 | 亚洲一区免费在线 | 中文字幕视频 | 亚洲资源在线观看 | 日韩在线观看第一页 | 久久午夜色播影院免费高清 | 国产视频资源在线观看 | 国产三级久久久 | 欧美日韩国产页 | 在线观看视频日韩 | 正在播放一区二区 | 国产视频一区在线 | 在线之家免费在线观看电影 | 亚洲九九精品 | 国产精品igao视频网入口 | 中文电影网 | 99热99re6国产在线播放 | 六月丁香色婷婷 | 天天综合狠狠精品 | 午夜10000| 国产又粗又猛又爽 | www.久久久.cum | 亚洲人视频在线 | 久久成人人人人精品欧 | 免费国产在线视频 | 深爱开心激情网 | 在线免费观看黄色小说 | 免费看三级 | 国产蜜臀av | 青草视频在线播放 | 久久短视频 | 日本公乱妇视频 | 91成人精品一区在线播放69 | 亚洲在线精品 | 一区二区在线影院 | 91成人精品在线 | 日韩美女一级片 | 国产成人精品国内自产拍免费看 | 97av视频| 亚洲综合在线五月 | 国产色视频一区 | 在线一级片 | 97香蕉久久国产在线观看 | 国内外成人免费在线视频 | 精品视频一区在线 | 999久久a精品合区久久久 | 国产高清99 | 在线观看亚洲免费视频 | 国产高清小视频 | 天天操天天色综合 | 国产精品福利在线观看 | 狂野欧美激情性xxxx欧美 | 在线观看日韩视频 | 免费在线中文字幕 | 98超碰在线观看 | 在线之家免费在线观看电影 | 成年人黄色大片在线 | 在线观看你懂的网址 | 婷婷色网址| 精品一区二区电影 | 在线观看91 | 国产精品美女久久久久久久 | 亚洲精品自拍 | 看av免费网站 | 中文字幕视频网站 | 超碰在线97国产 | 美女免费视频一区 | 日本三级大片 | 日韩久久久久久久久久 | 99久久日韩精品免费热麻豆美女 | av丝袜制服 | www.午夜视频 | 亚洲精品美女久久久久 | 9ⅰ精品久久久久久久久中文字幕 | 西西www4444大胆在线 | 国产午夜精品一区二区三区在线观看 | 欧美日在线观看 | 久久久久久国产精品美女 | 欧美日韩一区二区三区不卡 | 在线免费av网 | 在线之家免费在线观看电影 | 欧美一级淫片videoshd | 国产中文字幕一区二区 | 午夜精品一区二区三区四区 | 国产麻豆精品久久 | 亚洲精品视频在线观看网站 | 久久久综合九色合综国产精品 | 麻豆传媒视频观看 | 二区三区在线视频 | 精品久久久久久久久久久久久久久久 | 婷婷精品视频 | 欧美日韩国内在线 | 九九在线精品视频 | 午夜私人影院 | 碰碰影院 | 久久久999 | 最新日韩在线观看视频 | av观看网站 | 久草在线免费在线观看 | 国产激情免费 | 久久人人精 | 国产精品久久久久久久久久久杏吧 | 三级动图| 久久久免费精品视频 | 韩日成人av | 色就色,综合激情 | 91丨九色丨国产在线 | 96精品高清视频在线观看软件特色 | 国产中文字幕在线免费观看 | 免费又黄又爽视频 | 久草在线免费看视频 | 日韩视频免费在线观看 | 在线观看中文字幕2021 | 亚洲人成免费网站 | 中文字幕在线视频国产 | 久草在线91 | 成人毛片在线观看视频 | 国产精品欧美久久久久久 | 亚洲精品国偷拍自产在线观看 | 亚洲精品国精品久久99热 | 91精彩在线视频 | 狠狠色丁香九九婷婷综合五月 | 免费看片网站91 | 久久精品一区二区三区视频 | 99精品欧美一区二区三区 | 久久伦理 | 91爱爱免费观看 | 91久久国产自产拍夜夜嗨 | 综合网天天色 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产精品123 | 久久久久久久久久电影 | 青草草在线 | 欧美性受极品xxxx喷水 | 国产偷国产偷亚洲清高 | 久久免费a | 久久免费美女视频 | 午夜三级理论 | 国产精品久久精品国产 | 西西大胆免费视频 | 免费av黄色 | 人成午夜视频 | 天天操夜夜逼 | 色播五月激情五月 | 91av观看 | 欧美 日韩 成人 | 在线观看久久 | 黄色毛片电影 | 亚洲精品高清一区二区三区四区 | 777奇米四色| 亚洲精品av在线 | 天天av天天 | www.97色.com| 99久久er热在这里只有精品66 | 丁香影院在线 | 91精品国产一区二区在线观看 | 最新日本中文字幕 | 欧美污网站 | 日韩区在线观看 | 国产1区2区3区精品美女 | 碰超在线观看 | www.久久91 | 99精品一区二区三区 | 女人久久久久 | 成人动漫精品一区二区 | 日本aa在线 | 一区免费视频 | 少妇视频一区 | 成人av资源 | 日日夜夜精品视频天天综合网 | 成人av动漫在线 | 在线a人片免费观看视频 | 日韩影视精品 | 精品96久久久久久中文字幕无 | 国产精品美女www爽爽爽视频 | 91在线免费公开视频 | av色综合网 | 天天干,天天射,天天操,天天摸 | 综合激情久久 | 美女精品久久 | 中文字幕免费高清在线观看 | 国产在线观看av | 又黄又爽又无遮挡的视频 | 国产二区免费视频 | 人人插人人做 | 欧美极品裸体 | 99国产一区二区三精品乱码 | 免费在线观看一区二区三区 | 黄a在线看| 久久看毛片 | 毛片一二区 | 天天操天天曰 | 婷婷丁香在线观看 | 精品视频专区 | 欧美激情精品久久久 | 日韩在线视频一区二区三区 | 色网免费观看 | 91系列在线观看 | 草免费视频 | 精品毛片久久久久久 | 探花视频在线观看+在线播放 | 中文字幕免费高清 | 开心激情网五月天 | 久久精品一二三区白丝高潮 | 久久黄色小说 | 亚洲午夜小视频 | av观看网站 | 日韩三级.com | 西西4444www大胆无视频 | 欧美日韩亚洲精品在线 | 日韩午夜一级片 | 欧美久久久久久久久久久 | 成人国产精品久久久 | 91伊人久久大香线蕉蜜芽人口 | 久久精品人| 激情在线网站 | 免费视频一级片 | 麻豆久久久久久久 | 91精选在线观看 | 国产精品刺激对白麻豆99 | 久久久免费精品视频 | 国产第页 | 三级黄在线 | 伊人六月| 国色天香av| 国产香蕉97碰碰久久人人 | 国产免费一区二区三区网站免费 | 国产又粗又长的视频 | 欧美激情精品久久久久久免费 | 麻豆91精品91久久久 | 免费看av片网站 | 亚洲黄色av网址 | 国产一二三四在线观看视频 | 国产一区二三区好的 | 三级黄色片在线观看 | 久久久网 | 国产精品美女久久久久久久 | 亚洲精品视频久久 | 特级毛片在线免费观看 | 欧美性黑人 | 日韩性片 | 91av在线看 | 欧美视频国产视频 | 六月丁香六月婷婷 | 亚洲a在线观看 | 日韩精品中文字幕有码 | ww亚洲ww亚在线观看 | 在线免费视频a | 中文字幕免费播放 | 国产麻豆成人传媒免费观看 | 婷婷激情在线 | 欧美日韩国产区 | 97超级碰碰碰碰久久久久 | 亚洲精品国产区 | 国产精品毛片久久久久久 | 最近免费中文字幕大全高清10 | 国产精品美 | 免费观看国产视频 | 亚洲另类视频在线观看 | av片中文| 国产91亚洲精品 | 五月天久久狠狠 | 91av在线视频免费观看 | 亚洲精品小视频 | 欧美一区二视频在线免费观看 | 亚洲午夜在线视频 | 精品日韩在线一区 | www.午夜色.com| 91最新国产| 国产特级毛片 | 亚洲精品乱码久久久久久按摩 | 国产成人av网 | 91视频com | 91免费国产在线观看 | 国内外成人免费在线视频 | 久久久www成人免费毛片 | 日韩精品短视频 | 99国产成+人+综合+亚洲 欧美 | 欧美日韩视频在线观看免费 | 久久久精品一区二区 | 日韩精品视频网站 | 狠狠干婷婷 | 国产一区在线免费观看视频 | 在线视频日韩欧美 | 天天射天天干天天插 | 天天干天天综合 | 麻豆视频在线免费 | 亚洲国产精品久久久久婷婷884 | 久久试看| 在线有码中文 | 天天鲁天天干天天射 | 亚洲最新视频在线播放 | 欧洲亚洲精品 | 国内精品久久久久久久久久清纯 | 美女国产网站 | 国产精品久久久久久久久久三级 | 欧美日韩后 | 91久久久久久国产精品 | 国产精品理论视频 | 色狠狠婷婷 | 91精品视频播放 | 伊色综合久久之综合久久 | 国产传媒中文字幕 | 亚洲美女精品视频 | 色鬼综合网 | 99热最新精品 | 日日夜夜天天射 | 一区二区三区四区久久 | 99精品视频在线观看免费 | 香蕉91视频 | 国产二区视频在线观看 | 一区二区三区精品在线视频 | 亚洲作爱视频 | 最近中文字幕免费大全 | 成年人网站免费在线观看 | 99在线视频观看 | 国产精品久久毛片 | 91亚洲国产成人久久精品网站 | 日韩午夜视频在线观看 | 国产精品久久久久久婷婷天堂 | 亚洲在线国产 | 国产黄免费在线观看 | 中文字幕在线视频第一页 | 午夜久久福利视频 | 亚洲天堂免费视频 | 久久久久欧美精品999 | 激情综合亚洲精品 | 在线观看视频免费播放 | 特级毛片在线 | 日韩网站免费观看 | 国产精品久久久久久久久软件 | 成人久久精品视频 | 国产伦理久久 | 欧日韩在线 | 欧美国产精品久久久久久免费 | 天天射色综合 | 久久艹中文字幕 | www国产亚洲精品久久麻豆 | 天天色综合久久 | 国内精品一区二区 | 久久精品永久免费 | 91香蕉视频色版 | 综合网伊人 | 免费看片网址 | 91高清完整版在线观看 | 永久免费精品视频 | av大片免费在线观看 | 成人一级片在线观看 | 久久综合狠狠综合 | 四虎影视8848aamm | 亚洲九九九| 欧美中文字幕第一页 | 色婷婷激情四射 | 97热视频 | 色资源二区在线视频 | a在线视频v视频 | 国产99久久精品 | 国产日韩av在线 | 天天玩天天操天天射 | 精品久久久久久电影 | 97视频在线观看网址 | 欧美日韩国产一区二区在线观看 | 国产精品视频app | 天天天天天天天天操 | 国产高清在线一区 | 在线观看精品一区 | 日本中文字幕一二区观 | 久久69精品 | 欧美性生活一级片 | 免费观看mv大片高清 | 日韩91在线 | 日韩av成人在线观看 | 最新国产精品亚洲 | 国产91精品一区二区麻豆网站 | 亚洲精品在线观看不卡 | 一级精品视频在线观看宜春院 | 久久久免费在线观看 | 亚洲人久久 | 久久精品高清视频 | 中文字幕在线观看视频一区 | 99久久婷婷 | 伊人首页 | 亚洲经典在线 | 久草在线费播放视频 | 欧美日韩激情视频8区 | 欧美精品久久久久a | 亚洲欧洲成人 | 人人添人人 | 亚洲色图av | 综合网在线视频 | 久久久五月天 | 久久亚洲国产精品 | 丁香六月中文字幕 | 三级黄免费看 | 天天操天天干天天玩 | 日韩国产高清在线 | 五月婷香 | 日韩高清久久 | 91手机在线看片 | 婷婷成人综合 | 成人一级片在线观看 | 最近日韩中文字幕中文 | 国产精品99在线播放 | 婷婷丁香国产 | 黄色网www | 99视频免费| 日韩91在线 | 91成人在线免费观看 | 色天堂在线视频 | 国产一级久久久 | 精品久久国产精品 | 中文字幕在线播放av | 久久www免费视频 | 丁香 久久 综合 | 六月丁香激情综合 | 国产精品久久久久免费观看 | 亚洲自拍偷拍色图 | 国产成人久久精品亚洲 | 日日草av | 免费看黄色大全 | 成人黄大片 | 有码中文在线 | 人人爽人人插 | 九九久久婷婷 | 美女一区网站 | 亚洲一区二区三区精品在线观看 | 四虎成人网| 日韩色爱 | 久保带人| 91精品看片 | 国产第页| 一区中文字幕在线观看 | 麻豆视频在线免费看 | 日韩免费专区 | 欧美一级日韩免费不卡 | 最近日本字幕mv免费观看在线 | 久久综合久久久 | 97色婷婷人人爽人人 | 99视频精品免费观看, | 手机在线观看国产精品 | 日本精品视频在线观看 | 久久免费视频2 | 国产高清视频免费最新在线 | 中国美女一级看片 | av在线一二三区 | 黄色最新网址 | 欧美二区在线播放 | 亚洲日本va中文字幕 | 99精品视频在线观看视频 | 瑞典xxxx性hd极品 | 精品久久久久一区二区国产 | 91成人免费电影 | 九九九在线观看 | 亚洲精品国产高清 | 精品xxx | 久久爱导航 | 国产 亚洲 欧美 在线 | www.亚洲精品在线 | 最近高清中文在线字幕在线观看 | 黄色软件在线观看免费 | 国产一区播放 | 日批视频在线播放 | 免费能看的黄色片 | 国产一区在线看 | 亚洲精品毛片一级91精品 | 在线国产欧美 | www.黄色片网站 | 99综合电影在线视频 | 欧美一级日韩三级 | 免费看三级黄色片 | 91黄色在线视频 | 精品主播网红福利资源观看 | av电影在线观看完整版一区二区 | 久久伦理 | 日韩欧美高清在线 | 久久情网| 色综合久久久久综合体桃花网 | 91av小视频 | 国产免费精彩视频 | 欧美成人黄色 | 日韩av电影免费观看 | 看av在线| 日韩在线不卡视频 | 日日干天天操 | 国产精品久久久久久久久久久久午夜 | 黄色免费看片网站 | 国产三级精品三级在线观看 | 亚洲欧美综合精品久久成人 | 国产视频 久久久 | 精品在线观看一区二区 | 成人毛片网 | 亚洲综合色婷婷 | 中文国产在线观看 | 日韩四虎 | free. 性欧美.com | 亚洲一区二区三区毛片 | 欧美日韩高清 | 国产精品久久久久久久99 | 综合网久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产精品精品国产婷婷这里av | 丝袜美腿一区 | 国产手机视频在线观看 | av最新资源 | 国产精品免费视频观看 | 国产精品午夜免费福利视频 | 天天草天天干 | 91丨九色丨国产在线 | 国产精品免费视频久久久 | 国产91精品久久久久久 | 午夜少妇一区二区三区 | 国产精品99免费看 | 久久爱导航 | 综合伊人av| 国产精品久久久久婷婷二区次 | 不卡中文字幕在线 | 久久九九久久九九 | 亚洲黄色片 | 探花视频网站 | 亚洲精品在线观看av | 久热免费在线观看 | 亚洲区另类春色综合小说校园片 | 久久一久久 | 2020天天干夜夜爽 | 最新动作电影 | 人人爽人人爽人人爽 | 97视频网站 | 久久久久免费看 | 色之综合网 | 国产精品久久久久久久久久白浆 | 激情xxxx | 欧美黑人猛交 | 超碰在线9 | 精品国产一区二区三区四区在线观看 | 久久99热精品这里久久精品 | 91成人午夜 | 色综合人人| 18久久久 | 久久精品国产美女 | 日韩电影在线观看一区 | 99精品偷拍视频一区二区三区 | 91在线永久| 97视频精品 | 色wwwww| 久久免费片 | 色欧美综合 | 久久精品99久久久久久 | 国产成人在线网站 | 国产在线精 | 免费在线观看黄 | 伊人日日干 | 三级黄色大片在线观看 | 久久久久久久久久久精 | 黄色小说免费在线观看 | 久久精品国产一区二区三区 | 国产98色在线 | 日韩 | 狠狠干在线 | 在线中文字幕一区二区 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 国产伦精品一区二区三区无广告 | 丁香激情综合久久伊人久久 | 日韩中文字幕免费在线观看 | 欧美一区二区三区在线 | 免费看特级毛片 | 99久久99久久综合 | 欧美一级在线观看视频 | 国产99久久九九精品免费 | 久久久久久久国产精品影院 | 久久精品成人热国产成 | 在线观看国产高清视频 | 天天干天天做 | 国产精品网在线观看 | 国产特级毛片 | 国产精品一区在线 | 色中文字幕在线观看 | 超碰在线资源 | 国产精品福利久久久 | 天天撸夜夜操 | 中文字幕亚洲欧美日韩2019 | 99在线热播| 97色综合 | 日韩视频免费在线 | 天天爱av导航| 免费在线观看av网址 | 欧美一级爽 | 2019中文字幕第一页 | 日韩中文字幕国产精品 | 日韩综合精品 | 91人人干 | 免费视频色 | 99久久日韩精品视频免费在线观看 | 亚洲欧洲xxxx | 日韩中文久久 | 久久精品波多野结衣 | 国产精品99久久久久人中文网介绍 | 久久99网 | 毛片一二区 | 久久精品日产第一区二区三区乱码 | 亚洲精品乱码久久久久久蜜桃不爽 | 日日夜夜精品免费 | 精品国产精品久久一区免费式 | 久久私人影院 | 国产最新在线观看 | 国产精品日韩久久久久 | 青青河边草免费观看 | 日韩欧美一区二区三区在线观看 | 欧洲精品视频一区 | 欧美夫妻生活视频 | 国产3p视频| 一区二区不卡 | 中文字幕在线观 | 人人插人人爱 | 色视频成人在线观看免 | 中文字幕一区二区三区四区 | 久久久污 | 日韩视频一区二区三区 | 视频在线91| 国产一级免费电影 | 黄色一级大片在线观看 | 天天操天天爽天天干 | 久久天堂影院 | 亚洲在线成人精品 | 国产精品成久久久久三级 | 中文字幕色在线视频 | 手机在线日韩视频 | 亚洲 精品在线视频 | 欧美另类z0zx| 精品国产久 | 中文字幕乱视频 | 欧美日韩国产综合一区二区 | 99精品偷拍视频一区二区三区 | 国产精品国产三级在线专区 | 日韩精品在线视频 | 免费观看视频的网站 | 久久99久久99精品免观看粉嫩 | 日韩精品中文字幕有码 | 人人添人人澡人人澡人人人爽 | 欧美日韩国产精品一区二区三区 | 91精品国自产在线偷拍蜜桃 | 欧美 激情在线 | 亚洲 欧洲 国产 日本 综合 | av免费在线观 | 91av在线免费看 | 人人舔人人插 | 欧美精品国产综合久久 | av电影在线观看 | 五月婷婷电影网 | 视频在线99re | 美女网站色免费 | 日韩欧美电影在线 | 91成人精品一区在线播放 | 91成人网在线 | 人人爽久久久噜噜噜电影 | 五月天激情综合 | 在线观看av的网站 | www91在线观看| 国产一区高清在线观看 | av天天澡天天爽天天av | 黄色毛片大全 | 美女黄久久 | 91在线91| 久久亚洲区 | 91麻豆精品91久久久久同性 | 97在线观看免费高清 | 国产伦精品一区二区三区四区视频 | 日韩美精品视频 | 五月婷婷在线观看视频 | av网站在线免费观看 | 天天精品视频 | 国产精品亚洲片夜色在线 | 国产色婷婷精品综合在线手机播放 | 激情综合网在线观看 | 成人国产精品久久久春色 | 国产剧情在线一区 | 国产精品白浆视频 | 国产黄色一级片 | 国产在线精品播放 | 国产伦精品一区二区三区免费 | 麻豆视传媒官网免费观看 | 国产视频观看 | 国产一级精品绿帽视频 | 国产精美视频 | 亚洲国产精久久久久久久 | 国产久草在线 | 久久无码精品一区二区三区 | 欧美日韩国产综合一区二区 | 国产精品毛片久久蜜 | 色综合久久88色综合天天免费 | 国产亚洲欧洲 | 国产婷婷vvvv激情久 | 欧美日韩久久一区 | 91在线小视频 | 狠狠色噜噜狠狠狠狠 | 视频在线播放国产 | 中文字幕av全部资源www中文字幕在线观看 | 香蕉久久久久久久 | bbbb操bbbb| 天天操天天爽天天干 | 亚洲天堂网在线播放 | 国产又粗又猛又黄又爽视频 | 日韩欧美一区二区三区在线观看 | 国产99久久99热这里精品5 | 久久久久久久久久久免费av | 天天干天天射天天爽 | 欧美另类一二三四区 | 在线小视频你懂的 | 最新av网址在线观看 | 黄色成人影院 | 中文字幕视频网站 | 日韩羞羞| 国产日韩欧美视频 | 日韩精品视频免费在线观看 | 国产一二三四在线观看视频 | 一区二区三区在线播放 | 在线观看国产91 | 黄av资源| 亚洲午夜久久久久久久久 | 欧美一区二区日韩一区二区 | 97爱爱爱 | 日韩三级视频在线看 | 国产成人久久 | 亚洲欧洲精品在线 | 激情久久久久久久久久久久久久久久 | 久久99热久久99精品 | 免费日韩视频 | 国产视频一区二区在线 | 久久在线 | 婷婷去俺也去六月色 | 97国产大学生情侣酒店的特点 | 夜色在线资源 | 日韩av在线免费看 | a√国产免费a | 亚洲精品播放 | 91最新地址永久入口 | 精品久久久免费 | 免费观看黄| 久香蕉| 免费看国产曰批40分钟 | 99av国产精品欲麻豆 | 99久久99视频 | 亚洲精品色视频 | 国产小视频免费在线观看 | 99久久99视频只有精品 | 国产99免费视频 | 天堂麻豆| 国内免费的中文字幕 | 最新国产在线 | 久久欧洲视频 | 99精品视频在线观看 | 99久久精品国产观看 | 狠狠色狠狠色 | 日韩精品网址 | 久久精品2 | 久久久电影网站 | 韩国av一区二区 | 在线播放国产精品 | 99热手机在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 在线视频1卡二卡三卡 | 日韩精品国产一区 | 九七在线视频 | 亚洲三级av| 精品免费99久久 | 成人电影毛片 | 国内视频在线 | 一区二区三区日韩在线观看 | 日韩欧美精品在线视频 | 免费看成人av | 国产一区高清在线观看 | 天天干天天射天天操 | 二区三区中文字幕 | 亚洲欧洲精品一区二区精品久久久 | 91成人免费看 | 色网站免费在线观看 | av电影一区 | 国产电影一区二区三区四区 | 亚洲精品中文字幕视频 | 欧美日韩性视频在线 | 最新av网站在线观看 | 九九热免费视频在线观看 | 伊人中文网| 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 99精品一区 | 丁香五月亚洲综合在线 | 爱色av.com | 国产精品18毛片一区二区 | 黄免费网站 | 国产精品免费久久久久久 | 亚洲一区久久久 | 久久无码av一区二区三区电影网 | 久热超碰 | 综合色中文| 亚州国产视频 | 干狠狠| 色妞色视频一区二区三区四区 | 久久免费视频网站 | 在线亚洲高清视频 | 激情综合交 | 色香网 | 日韩精品无 | 亚洲伦理中文字幕 | 中文字幕在线第一页 | 日韩精品一区在线观看 | 亚洲一区二区三区毛片 | 欧美日韩二区三区 | 亚洲不卡123 | 日韩欧美高清在线 | 成人黄在线观看 | 亚洲精品国偷自产在线91正片 | 黄色免费在线视频 | 日韩中文字幕免费视频 | 久久久久久久免费 | 国产麻豆成人传媒免费观看 | 国产福利一区二区三区视频 | 成年人在线免费看视频 | 国产一区二区久久精品 | www.少妇| 成年人视频免费在线 | 中文字幕视频观看 | 色婷婷综合五月 | 在线观看国产永久免费视频 | 久久久久久久久久久久久久av | 欧美一级在线观看视频 | 91免费黄视频| 天天色宗合 | 色狠狠婷婷 | 成人av免费看 | 日韩中文字幕第一页 | 麻豆91在线播放 | 香蕉久草 | 中文字幕亚洲欧美日韩2019 | 91九色porn在线资源 | 亚洲电影院| 欧美一级在线看 | 碰超在线观看 | 免费黄色特级片 | 一区电影 | 亚洲精品自拍 | 一区二区中文字幕在线观看 | 美女黄频免费 | 亚洲毛片在线观看. | 黄色精品视频 | www.夜夜爽| 视频在线观看国产 | 一区二区中文字幕在线观看 | 欧美成人精品在线 | 2021av在线| 国产免费视频一区二区裸体 | 天天综合网久久综合网 | 亚洲精品国产精品国自产观看 | www.超碰97.com| 狠狠干狠狠久久 | 国产成人久久精品77777 | 欧美国产三区 | 国产一区二区精品久久91 | 九九九九精品九九九九 | 久久短视频 | av福利电影 | 久久精品国产精品亚洲 | 美女网站视频色 | 综合久久一本 | 久草免费在线 | 日韩精品中文字幕在线播放 | 久久看片网站 | 精品uu| 久草免费福利在线观看 | 人人射人人爱 | 久久99精品久久久久久 | 亚洲精品午夜久久久久久久 | 国产午夜亚洲精品 | 又色又爽又黄高潮的免费视频 | 久久电影国产免费久久电影 | 中文字幕在线资源 | 婷婷在线视频观看 | 国产精品毛片久久久 | 久久久国产精品麻豆 | 黄色精品久久 | 久久婷婷国产 | 五月开心网| 成人av网站在线观看 | 色婷婷电影 | 97色婷婷| 最近久乱中文字幕 | 蜜桃av久久久亚洲精品 | 一区二区三区在线免费观看 | 日韩欧美精品一区二区 | 久久深夜福利免费观看 | 婷婷伊人网 | 最新午夜电影 | 亚洲国产97在线精品一区 | 国产精品中文字幕av | 亚洲精品合集 | 国产人成一区二区三区影院 | 国产原创在线视频 | 天天操天天射天天操 | 精品免费观看视频 | 免费成人av在线看 | 久久国产亚洲精品 | 免费看的国产视频网站 | 2024av| 国产伦精品一区二区三区四区视频 | 久久成人免费视频 | 黄色三级网站在线观看 | 久久a热6| 免费成人看片 | 精品亚洲一区二区三区 | 丰满少妇麻豆av | 91伊人| 成人av在线电影 | 免费视频一级片 | 免费三级网 | 日本一区二区高清不卡 | 国产一级一片免费播放放 | 日日干天天爽 | 久久免费视频2 | 久色网 | 一区二区av | 日韩电影久久 | 久久精品久久精品久久39 | 日韩在线网址 | 视频99爱 | 精品国产自在精品国产精野外直播 | 免费看三级| 日韩欧美一区二区三区视频 | 亚洲欧美日韩在线一区二区 | 欧美色888 | 操操操人人人 | 午夜国产一区二区三区四区 | 久久免费看视频 | www.国产高清 | 色伊人网 | 国产精品久久久久久久久久久免费看 | 国产精品久久久久久五月尺 | 亚洲精品国内 | 国产尤物一区二区三区 | 国产精品系列在线播放 | 亚洲三级网站 | 精品国产91亚洲一区二区三区www | 国语黄色片 | 日韩精品一区二区在线 | 日日夜夜人人天天 | 欧美在线观看禁18 | 国产精品午夜av | 久久久综合电影 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产精品综合久久久久久 | 久久国产精品一区二区三区四区 | 99热播精品 | 亚洲理论片在线观看 | 国产精品麻 | 一区中文字幕电影 | 成人小视频在线播放 | 国产系列精品av | 亚洲成人av影片 | 久久免费片 | 久久久国产精华液 | 综合色亚洲 | 日韩av在线影视 | 狠狠狠干 | 美女网色 | 91视频在线免费看 | 九九九九九九精品任你躁 | 日本三级在线观看中文字 | 91久久国产自产拍夜夜嗨 | 国产亚洲成人网 | 草久在线 | av在观看 | 视频二区 | 国产成人精品福利 | av3级在线 | 久草影视在线 | 久久免费精彩视频 | 亚洲 成人 欧美 | 美女免费视频一区 | 99综合视频 | 欧美在线视频二区 | 午夜美女影院 | 男女激情网址 |