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

歡迎訪問 生活随笔!

生活随笔

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

C#

C#基础全接触

發布時間:2023/12/15 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#基础全接触 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引用類型是類型安全的指針,它們的內存是分配在堆(保存指針地址)上的。
String、數組、類、接口和委托都是引用類型。
強制類型轉換與as類型轉換的區別:當類型轉換非法時,強制類型轉換將拋出一個System.InvalidCastException異常,
而as不會拋出異常,它返回一個null值。
用using創建別名:using console = System.Console;
訪問限定符:
public??該成員可以被其他任何類訪問
protected 該成員只能被其派生類訪問
private??該成員只能被本類的其他成員訪問
internal 該成員只能在當前編譯單元的其他成員訪問
帶參數列表和返回值的Main方法:
class Test
{
??public static int Main(string[] args)
??{
? ? foreach (string arg in args)
? ? {
? ? ...
? ? }
??}
}
構造函數(constructor)包括實例構造函數和靜態構造函數。
構造函數與類名相同,且不能有返回值。例:
class TestClass
{
??TestClass()??//實例構造函數:可以訪問靜態成員和實例成員,用于初始化實例成員
??{
??...
??}

??static TestClass() //靜態構造函數:只能訪問靜態成員,用于初始化靜態成員
??{
??...
??}
}
類的靜態成員屬于類所有,不必生成實例就可以訪問,它是在載入包含類的應用程序時創建的,
但靜態方法不能訪問類的實例變量和方法。通常,靜態變量是在定義時就賦初始值的。
類的實例成員屬于類的實例所有,不創建實例對象就無法對其進行訪問,實例成員可以訪問類的
靜態成員和其它實例成員。
調用基類的析構函數:
class A
{
??public A()
??{
??...
??}
}
class B
{
??public B(): base()??//調用基類的析構函數
??{
??...
??}
}
常量:其值是在編譯時設定的,必須是數值文字。默認狀態下常量是靜態的。例:
class A
{
??public const double pi = 3.1415;
}
常量是編譯時就確定的值,只讀字段是在運行才能確定的值。比如運行時才能確定的屏幕分辨率。
只讀字段只能在類的析構函數中賦值。
靜態只讀字段:
class A
{
??public static readonly int ScreenWidth;??//靜態只讀字段
??static A()? ?//靜態析構函數
??{
? ? ScreenWidth = 1024;??//在靜態析構函數中初始化
??}
}
在類的繼承中,類的析構函數是不會被繼承的。
一個派生類只能從一個基類繼承,不能同時從多個基類繼承,但可以通過繼承多個接口來
達到相同目的。實現多繼承的唯一方法就是使用接口。例:
class MyFancyGrid: Control, ISerializable, IDataBound
{
...
}
密封類是不能繼承的類,抽象類不能被定義為密封類,且密封類的私有成員不能用protected修飾,
只能用private。例:
sealed class A
{
...
}
關鍵字ref和out用于指定用引用方式傳遞方法的參數。
它們的區別是:ref參數必須初始化,而out參數不需要初始化。所以在方法處理代碼依賴參數的
初始化值時使用ref,不依賴初始化值時使用out。
對out參數即使在傳遞前對其進行了初始化,其值也不會傳遞到方法處理函數內部。傳遞時系統
會將其設為未初始化。所以在方法內部必須對out參數進行初始化。
方法重載時,必須參數數目和參數類型其中之一不同,返回值不同不能作為重載。
C#不支持方法的默認值,只能通過方法重載來實現。例:
class A
{
??int Method(int a)
??{
??...
??}

??void Method(int a, int b) //參數數目不同
??{? ? //返回值不同不能作為重載
??...
??}
}
params參數用于一個不定數目參數的方法,一般后面跟一個數組。例:
class A
{
??public void Method(params int[] i)
??{
??...
??}
}
方法的覆蓋:指派生類覆蓋基類的同名方法,有二種方法
1)第一種是在派生類要覆蓋的方法前面加new修飾,而基類不需要作任何改動。
這種方法的缺點是不能實現多態。例:
class A
{
??public void Method()??//無需任何修飾
??{
??...
??}
}

class B: A? ?//從基類繼承
{
??new public void Method() //覆蓋基類的同名方法
??{
??...
??}
}

class TestClass
{
??A Instance = new B();
??Instance.Method();??//這時將調用類A的Method方法,而不是類B的Method方法
}

2)第二種是在派生類要覆蓋的方法前面加override修飾,而基類的同名方法前面加virtual修飾。
這樣就能實現多態,例:

class A
{
??virtual public void Method()? ?//基類定義虛方法
??{? ?? ?//虛擬方法不能定義為private,因為private成員對派生類是無法訪問的
??...
??}
}

class B: A? ???//從基類繼承
{
??override public void Method()? ?//派生類覆蓋基類的同名虛方法
??{
??...
??}
}

class TestClass
{
??protected void Test()
??{
? ? A Instance = new B();? ?//定義一個實例,類型為基類,從派生類創建
? ?? ?//派生類總是能夠向上轉換為其基類
? ? Instance.Method();? ? //將調用派生類B的Method方法,而不是基類的,這就是多態
??}
}

說明:new修飾的方法覆蓋不能實現多態的原因,是因為使用new時編譯器只會實現早期綁定(early binding)。
即調用的方法在編譯時就決定了:編譯器看到Instance.Method()而Instance的類是A,就會調用類A的Method()方法。
override修飾的方法覆蓋可以實現多態的原因,是因為實現了后期綁定(late binding)。
使用override時強制編譯器在運行時根據類的真正類型正確調用相應的方法,而不是在編譯時。
而基類的同名方法必須加virtual修飾。
類的靜態方法可能通過 類名.靜態方法名 這種格式來調用,不能使用 實例名.靜態方法名 這種方法調用。
因為類的靜態方法為類所有(是屬于類本身的),而非實例所有(不是屬于類的實例的)。
類的靜態方法可以訪問類的任何靜態成員,但不能訪問類的實例成員。
C#中類的變量稱為字段。類的public變量稱為類的公共字段。
類的屬性由一個protected(也可以是private)字段和getter和setter方法構成:
class Address
{
??protected string zipCode; //protected字段,注意大小寫
??public string ZipCode
??{
? ? get? ? //getter方法
? ? {
? ?? ?return zipCode;
? ? }
? ? set? ? //setter方法
? ? {
? ?? ?zipCode =??value;??//被傳遞的值自動被在這個value變量中
? ? }
??};
}
只讀屬性是指省略setter方法的屬性,只讀屬性只能讀取,不能設置。
屬性也可以用限定符virtual,override和abstract修飾,功能同其他類的方法。
屬性有一個用處稱為懶惰的初始化(lazy initialization)。即在需要類成員時才對它們進行
初始化。如果類中包含了很少被引用的成員,而這些成員的初始化又會花費大量的時候和系統
資源的話,懶惰的初始化就很有用了。
C#中數組對象共同的基類是System.Array。
將數組聲明為類的一個成員時,聲明數組與實例化數組必須分開,這是因為只能在運行時創建了
類的實例對象之后,才能實例化數組元素值。
聲明:
int[] intArray;??//一維數組
int[,,] int3Array; //三維數組
初始化:
intArray = new int[3] {1,2,3};
int[,] int2Array = new int[2,3] {{1,2,3},{4,5,6}}; //聲明時可以初始化
遍歷:
1)一維數組
for (int i = 0; i < intArray.Length; i++); //Array.Length返回數組所有元素的個數
foreach (int i in intArray);
for (int i = 0; i < intArray.GetLength (0); i++);//Array.GetLength(0)返回數組第一維的個數
2)多維數組
for (int i = 0; i < int3Array.GetLength(0); i++) //遍歷三維數組
??for (int j = 0; j < int3Array.GetLength(1); j++)
? ? for (int k = 0; k < int3Array.GetLength (2); k++)
? ? {
? ? ...
? ? }
數組的維數就是該數組的秩(Rank)。Array.Rank可以返回數據的秩。
鋸齒數組(jagged Array)是元素為數組的數組,例:
int[][] jaggedArray = new int[2][]; //包含二個元素,每個元素是個數組
jaggedArray[0] = new int[2];??//每個元素必須初始化
jaggedArray[1] = new int[3];
for (int i = 0; i < jaggedArray.Length; i++) //遍歷鋸齒數組
??for (int j = 0; j < jaggedArray[i].Length; j++)
??{
??...
??}
類的屬性稱為智能字段,類的索引器稱為智能數組。由于類本身作數組使用,所以用
this作索引器的名稱,索引器有索引參數值。例:
using System;
using System.Collections;
class MyListBox
{
??protected ArrayList data = new ArrayList();
??public object this[int idx]??//this作索引器名稱,idx是索引參數
??{
? ? get
? ? {
? ?? ?if (idx > -1 && idx <??data.Count)
? ?? ?{
? ?? ???return data[idx];
? ?? ?}
? ?? ?else
? ?? ?{
? ?? ???return null;
? ?? ?}
? ? }
? ? set
? ? {
? ?? ?if (idx > -1 && idx < data.Count)
? ?? ?{
? ?? ???data[idx] = value;
? ?? ?}
? ?? ?else if (idx = data.Count)
? ?? ?{
? ?? ???data.Add(value);
? ?? ?}
? ?? ?else
? ?? ?{
? ?? ???//拋出一個異常
? ?? ?}
? ? }
??}
}
接口是二段不同代碼之間約定,通過約定實現彼此之間的相互訪問。
C#并不支持多繼承,但通過接口可實現相同功能。
當在接口中指定了實現這個接口的類時,我們就稱這個類"實現了該接口"或"從接口繼承"。
一個接口基本上就是一個抽象類,這個抽象類中除了聲明C#類的其他成員類型——例如屬性、
事件和索引器之外,只聲明了純虛擬方法。
接口中可以包含方法、屬性、索引器和事件——其中任何一種都不是在接口自身中來實現的。例:
interface IExampleInterface
{
??//property declaration
??int testProperty { get; }

??//event declaration
??event testEvevnt Changed;

??//mothed declaration
??function void testMothed();

??//indexer declaration
??string this[int index] { get; set; }
}
說明:定義接口時,在方法、屬性、事件和索引器所有這些接口成員都不能用public之類的訪問限定符,
因為所有接口成員都是public類型的。
因為接口定義了一個約定,任何實現一個接口的類都必須定義那個接口中每一個成員,否則將編譯失敗。例:
using System;
public class FancyControl
{
??protected string data;
??public string Data
??{
? ? get {return this.data;}
? ? set {data = value;}
??}
}

interface IValidate
{
??bool Validate(); //接口方法
}

public class MyControl: FancyControl, IValidate
{
??public MyControl()
??{
? ? data = "my control data";
??}

??public bool Validate()??//實現接口
??{
? ? if (data == "my control data")
? ?? ?return true;
? ? else
? ?? ?return false;
??}
}
class InterfaceApp
{
??MyControl myControl = new MyControl();
??
??IValidate val = (IValidate)myControl;??//可以將一個實現某接口的類,轉換成該接口
??bool success = val.Validate();??//然后可調用該接口的方法
}
也可以用:
bool success =??myControl.Validate();
這種方法來調用Validate方法,因為Validate在類MyControl中是被定義成public的,如果去除public,Validate方法被隱藏,
就不能用這種方法調用了,這樣隱藏接口方法稱為名字隱藏(name hiding)。
可以用:類實例 is 接口名 來判斷某個類是否實現了某接口,例:
myControl is IValidate??//MyControl類的實例myControl是否實現了IValidate接口
當然,也可用as來作轉換,根據轉換結果是否為null來判斷某個類是否實現了某接口,例:
IValidate val = myControl as IValidate;
if (null == val)
{
...??//沒有實現IValidate接口
}
else
{
...??//實現了IValidate接口
}

如果一個類從多個接口繼承,而這些接口中如果定義的同名的方法,則實現接口的方法時,必須加接口名來區別,
寫成 接口名.方法名。假設Test類從IDataStore和ISerializable二個接口繼承,而這二個接口都有SaveData()方法,
實現SaveData()方法時必須寫成:
class Test: ISerializable, IDataStore
{
??void ISerializable.SaveData()
??{
??...
??}

??void IDataStore.SaveData ()
??{
??...
??}
}

如果一個類從多個接口繼承,為了方便可以定義一個新的接口,這個接口繼續多個接口,然后類直接從這個接口繼承就
可以了,這個叫合并接口。例:
interface ISaveData: ISerializable, IDataStore
{??//不需要定義任何方法或成員,只是用作合并
}
class Test: ISaveData??//只要繼承ISaveData就可以了
{
...
}
C# 操作符優先級(從高到低)
初級操作符 () x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked
一元操作符 + - | ~ ++x --x (T)x
乘除操作符 * / %
加減操作符 + -
位移操作符 << >>
關系操作符 < > <= >= is
等于操作符 ==
邏輯與??&
邏輯異或 ^
邏輯或??|
條件與??&&
條件或??||
條件操作符 ?:
賦值操作符 = *= /= %= += -= <<= >>= &= ^= |=
所有的二元操作符除賦值符外都是左聯合的,即從左到右計算。
typeof()運算符可以從一個類名得到一個System.Type對象,而從System.Object對象繼承來的GetType ()方法
則可從一個類實例來得到一個System.Type對象。例:
Type t1 = typeof(Apple); //Apple是一個類名
Apple apple = new Apple(); //apple是Apple類的一個實例
Type t2 = apple.GetType(); //t1與t2是相同的
通過反射得到一個類的所有成員和方法:
Type t = typeof(Apple);
string className = t.ToString(); //得到類名
MethodInfo[] methods = t.GetMethods(); //得到所有方法
foreach (MethodInfo method in methods)
{
//用method.ToString()得到方法名
}
MemberInfo[] members = t.GetMembers(); //得到所有成員
foreach (MemberInfo member in members)
{
//用member.ToString()得到成員名
}
sizeof()操作符用來計算值類型變量在內存中占用的字節數(Bytes),并且它只能在unsafe(非安全)
代碼中使用。例:
static unsafe public void ShowSizes()
{
??int i, j;
??j = sizeof(short);
??j = sizeof(i);
}
盡可能使用復合賦值操作符,它比不用復合賦值操作符的效率高。
for語句的語法為:
for (initialization; Boolean-expression; step)
??embedded-statement
在initialization和step部份還可以使用逗號操作符,例:
for (int i = '0', j = 1; i <= '\xFF'; i++, j++)
for (int i = 1, j = 1; i < 1000; i += j, j = i - j) //輸出斐波那契數列
Console.Write("{0} ", i);
在switch語句中執行一個分支的代碼后還想執行另一個分支的代碼,可以用:
goto case 分支;
操作符重載是為了讓程序更加自然,容易理解。想要為一個類重新定義一個操作符,使用以下語法:
public static 返回值 operator 操作符 (操作對象1[,操作對象2])
說明:
1)所有重載的操作符方法都必須定義為public和static
2)從技術上說返回值可以是任何類型,但通常是返回所定義方法使用的類型
3)操作對象的數目取決于重載是一元操作符還是二元操作符,一元操作符只要一個操作對象,二元操作符則需要二個。
4)不管重載是一元操作符還是二元操作符,第一個操作對象的類型都必須與返回值的類型一致;而對于二元操作符的第二個
操作對象的類型則可以是任何類型。
5)只有下列操作符可以被重載:
一元:+ - ! ~ ++ -- true false
二元:+ - * / % & | ^ << >> == != > < >= <=
賦值操作符(+=,-=,*-,/=,%=等等)無法被重載。
[]和()操作符也無法被重載。
6)操作符的優先級是無法改變的,運算優先級的規則是靜態的。

例:假設一個Invoice發票類由多個InvoiceDetailLine類(成員只有一個Double類型的Amount金額屬性)組成,
我們重載+操作符,使之可以將InvoiceDetailLine類的內容(注意不是金額合計)加在一起。
class Invoice
{
??public ArrayList DetailLine;
??
??public Invoice? ?//類的析構函數
??{
? ? DetailLine = new ArrayList(); //ArrayList存放多個InvoiceDetailLine類的實例
??}

??public static Invoice operator+ (Invoice Invoice1, Invoice Invoice2) //參數與返回值的類型一致
??{
? ? //Invoice1與Invoice2的內容合并
? ? Invoice ReturnInvoice = new Invoice();
? ? foreach(InvoiceDetailLine detailLine in??Invoice1.DetailLines)
? ?? ?ReturnInvoice.DetailLine.Add(detailLine);
? ? foreach(InvoiceDetailLine detailLine in Invoice2.DetailLines)
? ?? ?ReturnInvoice.DetailLine.Add(detailLine);
? ? return ReturnInvoice;
??}
}

class InvoiceAddApp??//調用示例
{
??public static void main()
??{
? ? Invoice i1 = new Invoice();
? ? for(int i = 0; i < 3; i++)
? ?? ?i1.DetailLine.Add(new InvoiceDetailLine(i + 1));

? ? Invoice i2 = new Invoice();
? ? for(int i = 0; i < 3; i++)
? ?? ?i2.DetailLine.Add(new InvoiceDetailLine(i + 1));

? ? Invoice summaryInvoice = i1 + i2;??//調用重載的操作符+方法
??}
}


自定義類型轉換可以編寫代碼實際二個不同的類、結構體之間的轉換。
語法:public static implicite/explicite operator 輸出類型 (輸入類型)
說明:
1)轉換方法必須是靜態的。
2)implicite表示隱式轉換,explicite表示顯式轉換。
3)輸入類型和輸出類型其中之一必須與包含轉換的類或結構體類型。即轉換必須與本類相關。
例:
struct Celisus
{
??public float t;

??public Celisus(float t)
??{
? ? this.t = t;? ?//this.t是結構體的字段,t是參數
??}

??public static implicite operator Celisus(float t) //float=>Celisus
??{
? ? return new Celisus(t);
??}

??public static implicite operator float(Celisus c) //Celisus=>float
??{
? ? return ((c.t - 32) / 9) * 5;
??}
}


代表的(delegate)目的與C++中的函數指針相同,代表不是在編譯時被定義的,而是在運行時被定義的。
代表主要有二個用途:回調(Callback)和事件處理(event)
回調通常用于異步處理和自定義處理。例:
class DBManager
{
??static DBConnection[] activeConnections;
??//聲明回調函數
??public void delegate EnumConnectionCallback(DBConnection connection);

??public static void EnumConnections(EnumConnectionCallback callback)
??{
? ? foreach (DBConnection connection in activeConnections)
? ? {
? ?? ?callback(connection);??//執行回調函數
? ? }
??}
}

//調用
class DelegateApp
{
??public static void ActiveConncetionCallback(DBConnection connection) //處理函數
??{
??...
??}

??public void main()
??{
? ? //創建指向具體處理函數的代表實例(新建一個代表,讓它指向具體的處理函數)
? ? DBManager.EmnuConnectionCallback myCallback = new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);
? ? DBManager.EnumConnections (myCallback);
??}
}

//使用靜態代表,上面的調用改為
class DelegateApp
{
??//創建一個指向處理函數的靜態代表
??public static DBManager.EmnuConnectionCallback myCallback
? ? = new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);
??public static void ActiveConncetionCallback(DBConnection connection)
??{
??...
??}

??public void main()
??{
? ? DBManager.EnumConnections(myCallback);
??}
}

//在需要時才創建代表,上面的調用改為
class DelegateApp
{
??//將創建代表放在屬性的getter方法中
??public static DBManager.EmnuConnectionCallback myCallback
??{
? ? get
? ? {
? ?? ?retun new DBManager.EmnuConnectionCallback(ActiveConncetionCallback);
? ? }
??}
??public static void ActiveConncetionCallback(DBConnection connection)
??{
??...
??}

??public void main()
??{
? ? DelegateApp app = new DelegateApp(); //創建應用程序
? ? DBManager.EnumConnections (myCallback);
??}
}


可以將多個代表整合成單個代表,例:
class CompositeDelegateApp
{
??public static void LogEvent(Part part)
??{
??...
??}

??public static void EmailPurchasingMgr(Part part)
??{
??...
??}

??public static void Main()
??{
? ? //定義二個代表
? ? InventoryManager.OutOfStockExceptionMethod LogEventCallback
? ?? ?= new InventoryManager.OutOfStockExceptionMethod(LogEvent);
? ? InventoryManager.OutOfStockExceptionMethod??EmailPurchasingMgrCallback
? ?? ?= new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);
? ? //整合為一個代表,注意后加的代表先執行(這里是先執行LogEventCallback)
? ? InventoryManager.OutOfStockExceptionMethod onHandExceptionEventsCallback
? ?? ?= EmailPurchasingMgrCallback + LogEventCallback;
? ? //調用代表
? ? InventoryManager mgr = new InventoryManager();
? ? mgr.ProcessInventory(onHandExceptionEventsCallback);
? ? //InventoryManager類的ProcessInventory方法的原型為:
? ? //public void ProcessInventory(OutOfStockExceptionMethod exception);
??}
}

可以根據需要將多個代表自由地組合成單個代表,例:
class CompositeDelegateApp
{
??//代表指向的處理函數(三個代表三個函數)
??public static void LogEvent(Part part)
??{
??...
??}

??public static void EmailPurchasingMgr(Part part)
??{
??...
??}

??public static void EmailStoreMgr(Part part)
??{
??...
??}

??public static void Main()
??{
? ? //通過數組定義三個代表
? ? InventoryManager.OutOfStockExceptionMethod[] exceptionMethods
? ?? ?= new InventoryManager.OutOfStockExceptionMethod[3];
? ? exceptionMethods[0] = new InventoryManager.OutOfStockExceptionMethod (LogEvent);
? ? exceptionMethods[1] = new InventoryManager.OutOfStockExceptionMethod(EmailPurchasingMgr);
? ? exceptionMethods[2] = new InventoryManager.OutOfStockExceptionMethod(EmailStoreMgr);

? ? int location = 1;
? ? //再定義一個代表(用于組合成單代表)
? ? InventoryManager.OutOfStockExceptionMethod compositeDelegate;
? ? //根據需要組合
? ? if (location = 2)
? ? {
? ?? ?compositeDelegate = exceptionMethods[0] + exceptionMethods[1];
? ? }
? ? else
? ? {
? ?? ?compositeDelegate = exceptionMethods[0] + exceptionMethods[2];
? ? }
? ? //調用代表
? ? InventoryManager mgr = new InventoryManager();
? ? mgr.ProcessInventory(compositeDelegate);
??}
}
C#的事件遵循"發布——預訂"的設計模式。在這種模式中,一個類公布能夠出現的所有事件,
然后任何的類都可以預訂這些事件。一旦事件產生,運行環境就負責通知每個訂戶事件已經發生了。
當代表作為事件的處理結果時(或者說定義具有代表的事件),定義的代表必須指向二個參數的方法:
一個參數是引發事件的對象(發布者),另一個是事件信息對象(這個對象必須從EventArgs類中派生)。
例:
using System;

class InventoryChangeEventArgs: EventArgs //事件信息對象,從EventArgs類派生
{
... //假設定義二個public屬性string Sku和int Change
}

class InventoryManager? ? //事件的發布者
{
??//聲明代表
??public delegate void InventoryChangeEventHander(object source, InventoryChangeEventArgs e);
??//發布事件,event關鍵字可將一個代表指向多個處理函數
??public event InventoryChangeEventHandler onInventoryChangeHander;
??
??public void UpdateInventory(string sku, int change)
??{
? ? if (change == 0)
? ?? ?return;
? ? InventoryChangeEventArgs e = new InventoryChangeEventArgs(sku, change);
? ? //觸發事件
? ? if (onInventoryChangeHandler != null) //如果有預訂者就觸發
? ?? ?onInventoryChangeHandler(this, e); //執行代表指向的處理函數
??}
}

class InventoryWatcher? ? //事件的預訂者
{
??public InventoryWatcher(InventoryManager mgr) //mgr參數用于聯結發布者
??{
? ? this.inventoryManager = mgr;
? ? //預訂事件,用 += 調用多個處理函數
? ? mgr.onInventroyChangeHandler += new InventoryManager.InventoryChangeEventHandler (onInventoryChange);
? ? //事件處理函數
? ? void onInventroyChange(object source, InventroyChangeEventArgs e)
? ? {
? ? ...
? ? }

? ? InventoryManager inventoryManager;
??}
}

class EventsApp? ???//主程序
{
??public static void Main()
??{
? ? InventoryManager inventoryManager = new InventoryManager();
? ? InventoryWatcher inventoryWatcher = new InventoryWatcher(inventoryManager);

? ? inventoryManager.UpdateInventory ("111 006 116", -2);
? ? inventoryManager.UpdateInventory("111 006 116", 5);
??}
}


Microsoft Windows NT和IBM OS/2等操作系統都支持占先型多任務。在占先型多任務執行中,處理器負責
給每個線程分配一定量的運行時間——一個時間片(timeslice)。處理器接著在不同的線程之間進行切換,
執行相應的處理。在單處理器的計算機上,并不能真正實現多個線程的同時運行,除非運行在多個處理器
的計算機上。操作系統調度的多線程只是根據分配給每個線程時間片進行切換執行,感覺上就像同時執行。

上下文切換(context switching)是線程運行的一部分,處理器使用一個硬件時間來判斷一個指定線程的時間片
何時結束。當這個硬件計時器給出中斷信號時,處理器把當前運行的線程所用的所有寄存器(registers)數據
存儲到堆棧中。然后,處理器把堆棧里那些相同的寄存器信息存放到一種被稱為"上下文結構"的數據結構中。
當處理器要切換回原來執行的線程時,它反向執行這個過程,利用與該線程相關的上下文結構,在寄存器里
重新恢復與這一線程相關的信息。這樣的一個完整過程稱為"上下文切換"。

多線程允許應用程序把任務分割為多個線程,它們彼此之間可以獨立地工作,最大限度地利用了處理器時間。

using System;
using System.Threading;

class SimpleThreadApp
{
??public static void WorkerThreadMethod() //線程的執行體
??{
??...? ?? ?//執行一些操作
??}

??public static void Main()
??{
? ? //創建一個線程代表指向線程的執行體,ThreadStart是創建新線程必須用到的代表
? ? ThreadStart worker = new ThreadStart(WorkerThreadMethod);
? ? Thread t = new Thread(worker);??//用線程代表創建線程
? ? t.Start();? ???//執行線程
??}
}

可以通過兩種方式來得到一個Thread對象:一種是通過創建一個新線程來得到,如上例;另一種在正在執行的線程調用
靜態的Thread.CurrentThread方法。
靜態方法Thread.Sleep(int ms)可以讓當前線程(它自動調用Thread.CurrentThread)暫停指定毫秒的時間。
如果使用Thread.Sleep(0)那么當前線程將一直處于等待中,直到另一個線程調用這個線程的實例方法Thread.Interrupt方法,
等待才會結束。
使用Thread.Suspend方法也能掛起線程,Thread.Suspend 方法可以被當前線程或其他線程調用,而Thread.Sleep(0)
只能由當前線程在執行體中調用。當線程用Thread.Suspend掛起時,必須用Thread.Resume方法恢復。不論Thread.Suspend
方法調用了多少次,只要調用Thread.Resume方法一次就可以線程恢復執行。用Thread.Suspend方法并不會阻塞線程,
調用立即返回。而Thread.Sleep(0)則會阻塞線程。所以確切地說Thread.Sleep (0)暫停線程,而不是掛起線程。
使用Thread.Abort方法可以終止正在執行的線程。當Thread.Abort方法被調用時,線程不會立即終止執行。運行環境將會
等待,直到線程到達文檔中所描述的"安全點"。如果要確保線程已經完全停止,可以使用Thread.Join方法。這是一個同步
調用,同步調用意味著直到線程完全停止,調用才會返回。
Thread.Priority屬性用于設置的線程的優先級。其值是Thread.ThreadPriority枚舉值,可以設為Highest, AboveNormal,
Normal, BelowNormal, Lowest。缺省值是Thread.ThreadPriority.Normal。
線程的同步是為了解決多個線程同時使用同一對象產生的一些問題。通過同步,可以指定代碼的臨界區(critical section),
一次只有一個線程可以進入臨界區。
使用System.Monitor類(鎖定與信號量)進行線程同步:
using System;
using System.Threading;

public void SaveData(string text) //線程執行函數或線程執行函數調用的對象的方法
{
??...? ?//執行其他一些不需要同步的處理

??Monitor.Enter(this); //獲取對象的Monitor鎖
??...? ?//執行需要同步的處理
??Monitor.Exit(this); //釋放對象的Monitor鎖

??...? ?//執行其他一些不需要同步的處理
}
說明:當執行Monitor.Enter方法時。這個方法會試圖獲取對象上的Monitor鎖,如果另一個線程已經擁有了
這個鎖,這個方法將會阻塞(block),直到這個鎖被釋放。
也可用C#的lock語句來獲得和釋放一個Monitor鎖。上面同步寫成:
public void SaveData(string text) //線程執行函數或線程執行函數調用的對象的方法
{
??...? ?//執行其他一些不需要同步的處理

??lock(this)??//獲取對象的Monitor鎖,代碼塊執行完成后釋放Monitor鎖
??{
??...? ?//執行需要同步的處理
??}

??...? ?//執行其他一些不需要同步的處理
}

也可以使用System.Threading名稱空間的Mutex類(互斥類)進行線程同步。與Monitor鎖一樣,一次只有一個線程
能獲得一個給定的互斥。但Mutex要慢得多,但它增加了靈活性。例:
using System;
using System.Threading;
class Database
{
??Mutex mutex = new Mutex(false); //創建一個互斥,但不立即獲得它
? ???//注意:創建互斥在需要同步的方法之外,實際上它只要創建一個實例
??public void SaveData(string text) //需要同步的方法
??{
? ? mutex.WaitOne();??//等待獲得互斥
? ? ...? ? //需要同步的處理
? ? mntex.Close();??//釋放互斥
??}
}

Mutex類重載了三個構造函數:
Mutex()? ?? ? //創建并使創建類立即獲得互斥
Mutex(bool initiallyOwned)? ? //創建時可指定是否要立即獲得互斥
Mutex(bool initiallyOwned, string muterName)??//還可以指定互斥的名稱
Mutex.WaitOne方法也重載了三次:
Mutex.WaitOne()? ?? ?//一直等待
Mutex.WaitOne(TimeSpan time, bool exitContext)??//等待TimeSpan指定的時間
Mutex.WaitOne(int milliseconds, bool exitContext) //等待指定的毫秒
線程的用法:
1)并發操作:比如一個程序監視多個COM口,當每個COM接到信息時執行一段處理時。
2)復雜長時間操作:一個長時間的復雜操作可能會使界面停滯,停止用戶響應,如果還允許用戶停止它,
或者顯示進度條、顯示操作執行進程信息時。
反射(Reflection)就是能夠在運行時查找類型信息,這是因為.NET編譯的可執行(PE)文件中包括MSIL和元數據(metadata)。
反射的中心是類System.Type。System.Type是一個抽象類,代表公用類型系統(Common Type System, CTS)中的一種類型。
using System;
using System.Reflection; //反射命名空間,必須引用

public static void Main(string[] args)
{
??int i = 6;
??Type t = i.GetType();? ?//根據實例得到類型
??t = Type.GetType("System.Int32"); //根據類型的字符名稱得到類型
}

通過Assembly類可以得到已經編譯.NET Framework程序的中所有類型,例:
using System;
using System.Diagnostics;??//為了使用Process類
using System.Reflection;??//為了使用Assembly類

class GetTypesApp
{
??protected static string GetAssemblyName(string[] args)
??{
? ? string assemblyName;
? ? if (0 == args.Length) //如果參數為空,取當前進程的名稱
? ? {
? ?? ?Process p = Process.GetCurrentProcess();
? ?? ?assemblyName = p.ProcessName + ".exe";
? ? }
? ? else
? ?? ?assemblyName = args[0]; //取第一個參數,即當前運行程序名

? ? return assemblyName;
??}

??public static void Main(string[] args)
??{
? ? string assemblyName = GetAssemblyName(args);
? ? Assembly a = Assembly.LoadFrom (assemblyName); //調用編譯程序集
? ? Type[] types = a.GetTypes();? ?//得到多個類型
? ? foreach (Type t in types)? ? //遍歷類型數組
? ? {
? ? ...??//取得t.FullName,t.BaseType.FullName等類型信息
? ? }
??}
}
一個應用程序可以包括多個代碼模塊。若要將一個cs文件編譯一個模塊,只要執行下面的命令:
csc /target:module 要編譯的模塊.cs??//csc是C Sharp Compiler(C#編譯器)
然后在應用程序中using編譯的模塊.cs中的NameSpace即可應用了。
要反射應用程序中所有代碼模塊(Module),只要:
Assembly a = Assembly.LoadFrom(assemblyName); //應用程序的物理文件名
Module[] modules = a.GetModules ();
foreach(Module m in modules)
{
... //顯示m.Name等
}
后期綁定(latebinding),例:
string[] fileNames = Directory.GetFiles(Environment.CurrentDirectory, "*.dll");
foreach (string fileName in fileNames)
{
??Assembly a = Assembly.LoadFrom(fileName);
??Type[] types = a.GetTypes();
??foreach(Type t in types)
??{
? ? if (t.IsSubclassOf(typeof(CommProtocol)))??//判斷是否有CommProtocol的派生類
? ? {
? ?? ?object o =??Activator.CreateInstance(t);??//生成實例
? ?? ?MethodInfo mi = t.GetMethod("DisplayName");
? ?? ?mi.Invoke(o, null);? ? //調用方法
? ? }
??}
}
//帶參數的例子
namespace Programming_CSharp
{
??using System;
??using System.Reflection;

??public class Tester
??{
? ? public static void Main( )
? ? {
? ?? ?Type t = Type.GetType("System.Math");
? ?? ?Object o = Activator.CreateInstance(t);

? ?? ?// 定義參數類型
? ?? ?Type[] paramTypes = new Type[1];
? ?? ?paramTypes[0]= Type.GetType("System.Double");

? ?? ?MethodInfo CosineInfo = t.GetMethod("Cos", paramTypes);

? ?? ?//設置參數數據
? ?? ?Object[] parameters = new Object[1];
? ?? ?parameters[0] = 45;

? ?? ?//執行方法
? ?? ?Object returnVal = CosineInfo.Invoke(o, parameters);
? ?? ?Console.WriteLine("The cosine of a 45 degree angle {0}", returnVal);
? ? }
??}
}
動態生成代碼和動態調用的完整例子:
//動態生成代碼的部分
using System;
using System.Reflection;
using System.Reflection.Emit;??//動態生成代碼必須引用

namespace ILGenServer
{
??public class CodeGenerator
??{
? ? public CodeGenerator()
? ? {
? ?? ?currentDomain = AppDomain.CurrentDomain;??//得到當前域
? ?? ?assemblyName = new AssemblyName();??//從域創建一個程序集
? ?? ?assemblyName.Name = "TempAssembly";
? ?? ?//得到一個動態編譯生成器, AssemblyBuilerAccess.Run表示只在內存中運行,不能保存
? ?? ?assemblyBuilder = currentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilerAccess.Run);
? ?? ?//從編譯生成器得到一個模塊生成器
? ?? ?moduleBuilder = assemblyBuilder.DefineDynamicModule ("TempModule");
? ?? ?//模塊生成器得到類生成器
? ?? ?typeBuilder = moduleBuilder.DefineType("TempClass", TypeAttributes.Public);
? ?? ?//為類添加一個方法
? ?? ?methodBuilder = typeBuilder.DefineMethod("HelloWord",??MethodAttributes.Public, null, null);
? ?? ?//為方法寫入代碼,生成代碼必須使用到IL生成器
? ?? ?msil = methodBuilder.GetILGenerator();
? ?? ?msil.EmitWriteLine("Hello World");
? ?? ?msil.Emit(OpCodes.Ret);
? ?? ?//最后還需要編譯(build)一下類
? ?? ?t = typeBuilder.CreateType();
? ? }
? ? AppDomain currentDomain;
? ? AssemblyName assemblyName;
? ? AssemblyBuilder assemblyBuilder;
? ? ModuleBuilder moduleBuilder;
? ? TypeBuilder typeBuilder;
? ? MethodBuilder methodBuilder;
? ? ILGenerator msil;
? ? object o;
? ? Type t;
? ? public Type T
? ? {
? ?? ?get
? ?? ?{
? ?? ???return this.t;
? ?? ?}
? ? }
??}
}
//動態調用的部分
using System;
using System.Reflection;
using ILGenServer;??//引用動態生成代碼的類
public class ILGenClientApp
{
??public static void Main(
??{
? ? CodeGenerator gen = new CodeGenerator(); //創建動態生成類
? ? Type t =??gen.T;
? ? if (null != t)
? ? {
? ?? ?object o = Activator.CreateInstance(t);
? ?? ?MethodInfo helloWorld = t.GetMethod("HelloWorld"); //為調用方法創建一個MethodInfo
? ?? ?if (null != helloWorld)
? ?? ?{
? ?? ???helloWorld.Invoke(o, null);??//調用方法
? ?? ?}
? ? }
??}
}
調用DLL
using System;
using System.Runtime.InteropServices; //為了使用DLLImport特性

class PInvokeApp
{
??[DllImport("user32.dll ", CharSet=CharSet.Ansi)] //CharSet.Ansi指定Ansi版本的函數(MessageBoxA),CharSet.Unicode指定Unicode版本的函數(MessageBoxW)
??static extern int MessageBox(int hWnd, string msg, string caption, int type);??//聲明DLL中的函數
??
??//[DllImport(" user32.dll", EntryPoint="MessageBoxA")] //用這種方法使用不同的函數名
??//static extern int MsgBox(int hWnd, string msg, string caption, int type);
??
??//[DllImport("user32.dll", CharSet=CharSet.Unicode )]??//調用Unicode版的DLL函數
??//static extern int MessageBox(int hWnd, [MarshalAs(UnmanagedType.LPWStr)]string msg,
??// [MarshalAs(UnmanagedType.LPWStr)]string caption, int type); //將LPWStr翻譯為string型,缺省情況系統只將LPStr翻譯成string
??public static void Main()
??{
? ? MessageBox(0, "Hello, World!", "CaptionString", 0);??//調用DLL中的函數
??}
}
例2,使用回調:
class CallbackApp
{
??[DllImport("user32.dll")]
??static extern int GetWindowText(int hWnd, StringBuilder text, int count);

??delegate bool CallbackDef(int hWnd, int lParam);

??[DllImport("user32.dll")]
??static extern int EnumWindows(CallbackDef callback, int lParam);

??static bool PrintWindow(int hWnd, int lParam)
??{
? ? StringBuilder text = new StringBuilder(255);
? ? GetWindowText(hWnd, text, 255);
? ? Console.WriteLine("Window Caption: {0}", text);
? ? return true;
??}

??static void Main()
??{
? ? CallbackDef callback = new CallbackDef(PrintWindow);
? ? EnumWindows(callback, 0);
??}
}
關鍵字unsafe指定標記塊在非控環境中運行。該關鍵字可以用于所有的方法,包括構造函數和屬性,
甚至還有方法中的代碼塊。關鍵字fixed負責受控對象的固定(pinning)。Pinning是一種動作,向
垃圾收集器(Garbage Collector, GC)指定一些不能被移動的對象。為了不在內存中產生碎片,.NET
運行環境把對象四處移動,以便于最有效地利用內存。使用fixed后指定對象將不會被移動,所以就
可以用指針來訪問它。
C#中只能得到值類型、數組和字符串的指針。在數組的情況下,第一個元素必須是值類型,因為C#
實際上是返回一個指向數組第一個元素的指針,而不是返回數組自身。
& 取一個變量的內存地址(即指向該變量的指針)
* 取指針所指變量的值
-> 取成員
例:
using System;
class UnsafeApp
{
??public static unsafe void Getvalues(int* x, int* y)
??{
? ? *x = 6;
? ? *y = 42;
??}

??public static unsafe void Main()
??{
? ? int a = 1;
? ? int b = 2;
? ? Getvalues(&a, &b);
??}
}
fixed語法為:fixed(type* ptr = expression) statements
其中type也可以為非控類型,也可是void;expression是任何產生一個type指針的表達式;
statements是應用的代碼塊。例:
fixed (int* f = &foo.x)??//foo是Foo類的一個實例,x是Foo類的一個int屬性
{
??SetFoovalue(f);??//SetFoovalue方法的定義為unsafe static void SetFoovalue(int* x)
}
傳統的COM組件可以通過互操作層(COM Interop)與.NET運行環境交互。互操作層處理在托管運行環境和非托管區域
中的COM組件操作之間傳遞所有的消息。
要使COM組件能在.NET環境中使用,必須為COM組件生成元數據。.NET運行環境用元數據層業判斷類型信息。在運行時刻
使用類型信息,以便生成RCW(Runtime Callable Wrapper,運行時可調用包裝)。當.NET應用程序與COM對象交互時,
RCW處理對COM對象的裝載和調用。RCW還完成許多其他的工作,如管理對象標識、對象生存周期以及接口緩沖區。
對象生存周期管理十分關鍵,因為.NET GC把對象到處移動,并且當對象不再使用時,自動處理這些對象。RCW服務告訴
.NET,應用程序正與托管.NET組件交互,同時又使非托管COM組件"覺得"COM對象是被傳統的COM客戶端調用的。
為了為COM組件生成元數據包裝,必須使用tlbimp.exe(TypeLib Importer)工具:
tlbimp some_COM.tlb /out:som_COM.dll

總結

以上是生活随笔為你收集整理的C#基础全接触的全部內容,希望文章能夠幫你解決所遇到的問題。

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

看片的网址 | 97超碰人人澡人人爱 | 久久九九久久九九 | 天天草综合 | 国产精品999久久久 久产久精国产品 | 五月天丁香亚洲 | 久草在线视频在线 | 亚洲黄色一级视频 | 中文字幕高清在线 | 五月香视频在线观看 | 亚洲精品国产拍在线 | 国产黄色av网站 | 欧洲成人免费 | 在线观看免费观看在线91 | 97精品国产一二三产区 | 天天操天天操天天操天天操天天操天天操 | 黄色小说在线免费观看 | www.在线观看av | 精品国产视频在线观看 | 色噜噜日韩精品欧美一区二区 | 欧美成人黄| 蜜臀av免费一区二区三区 | 天天插夜夜操 | 久久精品视频免费播放 | 国内久久久久 | av丝袜在线 | 亚洲欧美日韩国产一区二区三区 | 国产精品高 | 国产香蕉97碰碰久久人人 | 免费观看国产精品视频 | 日日摸日日添夜夜爽97 | 日韩簧片在线观看 | 麻豆国产在线播放 | 国产手机视频 | 中文字幕在线观看的网站 | 久久久精品高清 | 精品国产视频在线观看 | 开心激情综合网 | 国产精品免费久久久 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产精品久久电影观看 | 色搞搞 | 免费在线91 | 久久亚洲二区 | 在线观看视频福利 | 国产精品福利视频 | 日韩视频中文字幕 | 国产免费观看高清完整版 | 日韩剧| 亚洲精品国产视频 | 久久精品日本啪啪涩涩 | 正在播放国产精品 | 亚州中文av | 911亚洲精品第一 | 国产美女视频免费 | 国产在线观看a | 中文字幕在线久一本久 | 欧美日本啪啪无遮挡网站 | 黄色的网站在线 | 综合色站导航 | 最新动作电影 | 日韩一区二区三区在线看 | 黄网站色欧美视频 | 精品国产免费看 | 亚洲狠狠婷婷综合久久久 | 91精品久久久久久久久 | 久久国产精品久久国产精品 | 综合久久精品 | 天天艹天天爽 | 中文字幕av全部资源www中文字幕在线观看 | 91av影视 | 久久综合福利 | 免费国产在线视频 | 国产a网站 | 麻豆国产在线播放 | 亚洲1区 在线 | 又爽又黄在线观看 | 亚洲国产精品人久久电影 | 亚洲黄色三级 | 69国产盗摄一区二区三区五区 | 狠狠网站| 四虎成人精品在永久免费 | 亚洲天堂网在线播放 | 亚洲日本国产精品 | 精品国产成人av在线免 | 天天天天色射综合 | 亚洲专区一二三 | 久久与婷婷 | 黄色视屏av | 国产精品九九视频 | 久久精品免费电影 | 天天干天天操av | 99精品视频在线观看视频 | 免费av在线网站 | 中文字幕乱码一区二区 | 国产裸体视频网站 | www.亚洲视频 | 成人一区影院 | 天天操夜夜摸 | 欧美一区二区三区在线播放 | 热九九精品 | 97视频在线播放 | 日本视频久久久 | 天天操综合网站 | 免费久久网站 | 丰满少妇高潮在线观看 | 国产大片免费久久 | 99精品免费久久久久久日本 | 久久久久久国产精品美女 | av再线观看 | 在线观看午夜av | 久久精品欧美一区 | 国内成人精品2018免费看 | 天天摸日日摸人人看 | 久久伊人八月婷婷综合激情 | 色.www| 欧美日在线 | 免费黄a | 色悠悠久久综合 | 亚洲精品国产综合久久 | 中国一级片在线 | 91视频国产免费 | 91看片一区二区三区 | 成人av一级片| 草久久久 | 久草视频中文 | 欧美国产一区二区 | 亚洲国产精品电影在线观看 | 国产一区二区三区在线免费观看 | 精品国产激情 | 中文字幕第一页在线 | 欧美久久成人 | 五月婷婷婷婷婷 | 久久久久久久看片 | 久久五月激情 | 91大神免费视频 | 97精品国产| 国产一区高清在线观看 | 91av视频在线观看免费 | 国产午夜三级一区二区三桃花影视 | 成人啪啪18免费游戏链接 | 午夜精品一区二区三区免费 | 成年美女黄网站色大片免费看 | 国色天香在线 | 天天干天天操天天入 | 亚洲激情一区二区三区 | 日本精品午夜 | 毛片永久免费 | 在线成人看片 | 在线超碰av | 黄色的网站免费看 | 人人爽人人香蕉 | 91香蕉视频色版 | 亚洲精品国偷自产在线99热 | 免费国产在线精品 | 久久国内免费视频 | 久久99精品国产麻豆婷婷 | 国产精品 视频 | 免费在线观看不卡av | 欧美色图亚洲图片 | 久久婷婷一区二区三区 | 狠狠婷婷 | 日韩国产精品久久久久久亚洲 | 国产精品视频免费看 | 日韩免费一二三区 | 久草免费福利在线观看 | 手机在线视频福利 | 精品欧美在线视频 | 500部大龄熟乱视频使用方法 | 亚洲最大av网站 | 麻豆视频大全 | 99视频精品在线 | 亚洲视频axxx | 欧美日韩视频在线观看一区二区 | 伊人天天狠天天添日日拍 | 国产免费一区二区三区最新 | 亚洲精品男人的天堂 | 成人欧美在线 | 精品91在线 | 日韩区欠美精品av视频 | 天堂av在线7 | 五月婷婷中文字幕 | 人人爱爱 | 超级碰碰碰碰 | 国产视频一区在线免费观看 | 精品国产伦一区二区三区观看说明 | 久久国产亚洲视频 | 成人午夜精品福利免费 | 少妇自拍av | 天天操夜夜想 | 国产一区麻豆 | 天天草综合网 | 麻豆视屏| 狠狠操夜夜 | 91porny九色91啦中文 | 精品在线二区 | 正在播放国产精品 | 欧美色噜噜噜 | 黄色片网站 | 国偷自产中文字幕亚洲手机在线 | 国产成人免费在线 | 久久人人爽人人爽人人片 | 99成人在线视频 | 亚洲色图美腿丝袜 | 粉嫩aⅴ一区二区三区 | 国产亚洲精品久久久久久久久久 | 日本精品一区二区在线观看 | 国产99久久九九精品免费 | 亚洲在线不卡 | 天天天综合网 | 亚洲香蕉视频 | 天天综合成人 | 亚洲成av人电影 | 日韩av高潮| 中文字幕传媒 | 亚洲午夜精品久久久久久久久久久久 | 四虎成人精品在永久免费 | 免费视频久久久 | 国精产品999国精产品岳 | 免费久久网站 | 国产视频一区在线播放 | av在线免费播放网站 | 久久综合色综合88 | 婷婷综合影院 | 亚洲午夜久久久综合37日本 | 国产精品毛片一区视频播不卡 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | av黄色大片| 天天干天天操av | 不卡视频一区二区三区 | 91亚洲精 | 中文字幕资源网 | 91手机视频| 欧美日韩色婷婷 | 亚洲欧美va | 激情五月在线 | 久久国产精品久久精品国产演员表 | 免费观看一区二区 | 亚洲女人av | www.com久久久 | 午夜 久久 tv | x99av成人免费 | 三上悠亚在线免费 | 91在线网站| 亚洲最新合集 | 精品福利在线视频 | 看av在线 | 久久av观看 | 免费在线国产视频 | 成年人app网址| 国产97在线看 | 国内精品久久久久久 | 欧美乱大交 | 国产一区 在线播放 | 国产黄免费看 | 亚洲最新av网站 | 免费黄色a网站 | 日韩专区在线观看 | 超碰成人av | 久久综合九色九九 | 亚洲精欧美一区二区精品 | 国产美女网站视频 | 91精品免费 | 麻豆av一区二区三区在线观看 | 国产区第一页 | av丁香 | 免费h漫在线观看 | 99热九九这里只有精品10 | 国产精品免费看 | 99亚洲天堂 | 在线观看中文 | 国产中的精品av小宝探花 | 欧美日韩一区二区三区在线观看视频 | 亚洲国产影院 | 欧美日韩免费网站 | 久草www | 91在线播放综合 | 香蕉视频啪啪 | 国产一区二区三区 在线 | 日本黄色大片免费看 | 射久久 | 国产日本在线播放 | 亚洲视频456 | av超碰在线 | 精品一区二区av | 99色99| 国产69精品久久久久9999apgf | 免费一级黄色 | 亚洲精品女人久久久 | 91夫妻自拍 | 97人人爽 | 亚洲五月激情 | 国产馆在线播放 | 国产精品美女视频网站 | av中文字幕在线播放 | 久久九九久久精品 | 国产色啪 | 国产99久 | 狠狠色丁香久久婷婷综合五月 | 狠狠干天天| 日韩激情av在线 | 丁香视频全集免费观看 | 美女久久久久久久久久 | 午夜国产福利在线观看 | 99热精品国产一区二区在线观看 | 99情趣网视频 | 国产精品高潮呻吟久久久久 | 成片免费观看视频大全 | 草久久精品 | 五月在线 | 久久全国免费视频 | 久久久91精品国产一区二区精品 | 色婷婷狠狠五月综合天色拍 | 在线观看国产区 | 91精品久久久久久综合乱菊 | 国产精品爽爽爽 | 在线观看一级视频 | 91香蕉视频色版 | 99精品欧美一区二区 | 91成人免费看 | 91精品国产92久久久久 | 西西444www高清大胆 | 婷婷成人在线 | 久久视频在线免费观看 | 97在线资源 | 久久久在线免费观看 | 国内精品视频一区二区三区八戒 | 国产成人在线一区 | 天天色天天搞 | 欧美成人在线免费 | 久久久在线视频 | 高清视频一区二区三区 | 黄污视频网站大全 | 夜夜干天天操 | 亚洲欧美日韩一级 | 人人爽人人澡 | 麻豆视频在线 | 日韩视频免费在线观看 | www日日| 日韩狠狠操 | 在线视频你懂 | www在线观看国产 | 最新av网址在线 | 免费一级特黄录像 | 国产三级在线播放 | 天天干天天操人体 | 夜夜爽夜夜操 | 日韩午夜视频在线观看 | 99精品视频在线 | 中文字幕 在线 一 二 | 欧美日韩免费一区二区 | 中文字幕国产一区 | 中文字幕亚洲精品日韩 | 在线看成人av | 97夜夜澡人人爽人人免费 | 亚洲成人影音 | 男女靠逼app | 韩日电影在线免费看 | 一区二区三区电影 | 久久成人精品电影 | 免费福利在线视频 | 成人网色 | av青草| 色妞色视频一区二区三区四区 | 日韩av在线小说 | 久久全国免费视频 | 黄色一级大片在线免费看国产一 | 亚洲国产精品va在线看黑人动漫 | 成年人精品 | 9在线观看免费 | 国产手机精品视频 | 亚洲一区视频免费观看 | 天天操天天干天天插 | 中文亚洲欧美日韩 | 国产99爱 | 免费在线成人av电影 | 久久精品爱爱视频 | 四川妇女搡bbbb搡bbbb搡 | 国产小视频在线观看免费 | 友田真希av | 亚洲视频免费在线观看 | 日产av在线播放 | 国产中文视频 | 99精品在线直播 | 中文字幕黄色av | 精品资源在线 | 97成人在线观看 | 国产伦理一区二区 | 色婷婷狠狠五月综合天色拍 | 国产精品国产三级国产 | 免费三级影片 | 人人看人人爱 | 国产成人一区二区啪在线观看 | 免费在线观看中文字幕 | 久久久国产一区 | 黄色小网站在线 | www国产亚洲精品久久网站 | 久草在 | www.伊人网| 国产成人av网址 | 国产午夜不卡 | 在线看一区二区 | 欧美亚洲国产精品久久高清浪潮 | 国产精品国产毛片 | 国产xxxxx在线观看 | 日本爱爱免费视频 | 狠狠操狠狠操 | 久久久99国产精品免费 | 国产拍揄自揄精品视频麻豆 | 亚洲激精日韩激精欧美精品 | 97精产国品一二三产区在线 | 一区二区网 | 黄色亚洲片 | 亚洲午夜精品一区二区三区电影院 | 婷婷社区五月天 | 狠狠躁夜夜躁人人爽超碰91 | www.日日日.com | 久久午夜国产精品 | 在线观看国产 | 成人免费xxxxxx视频 | 日一日干一干 | 香蕉精品视频在线观看 | 在线播放日韩 | 五月综合激情 | 免费黄色一区 | 精品亚洲视频在线 | 久草在线视频新 | 中文字幕在线观看视频网站 | 中文在线www| а天堂中文最新一区二区三区 | 免费国产在线精品 | 国产 日韩 中文字幕 | 成人在线超碰 | 日韩精品一区二区三区水蜜桃 | 国产亚洲小视频 | 欧美日韩一区二区三区在线免费观看 | 激情久久婷婷 | 中文字幕在线观看国产 | 久久视频网址 | 成人av一区二区在线观看 | 久久久久久久99精品免费观看 | 国产黄大片在线观看 | 在线中文字幕观看 | 伊人天天操 | 在线a视频免费观看 | 在线看毛片网站 | 97视频亚洲| 五月网婷婷 | 久久理论视频 | 免费成人在线视频网站 | 国产精品久久久久久久久久久久冷 | 亚洲aⅴ在线 | 狠狠色丁香婷婷综合 | 欧美激情片在线观看 | 中文字幕久久精品一区 | 国产91精品看黄网站在线观看动漫 | 97在线精品国自产拍中文 | 91九色蝌蚪视频 | 激情av一区二区 | 国产成人精品午夜在线播放 | 国产一级免费播放 | 久久免费毛片视频 | 玖玖爱免费视频 | 国内精品国产三级国产aⅴ久 | 又黄又刺激 | 日韩v欧美v日本v亚洲v国产v | 天堂麻豆 | www.91国产| 色在线中文字幕 | 在线影视 一区 二区 三区 | 91女人18片女毛片60分钟 | 久久人视频 | 欧美日韩在线免费视频 | 国产一级在线免费观看 | 九九九九九九精品 | 亚洲视频99 | 色综合欧洲 | www.亚洲精品视频 | 国产亚洲午夜高清国产拍精品 | 久久久免费 | 干天天| 中文字幕 婷婷 | 手机成人av在线 | 亚洲精品影院在线观看 | www.天天射.com | 亚洲a色| 国产精品一区二区三区免费视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 成人动漫视频在线 | 欧美吞精 | 一级片视频免费观看 | 欧美另类成人 | 日韩一区在线播放 | 96av在线| 91精品国产乱码久久桃 | 久草免费看 | 免费下载高清毛片 | 免费a v在线 | 69xx视频| 在线激情av电影 | 综合色伊人 | 波多野结衣精品 | 天堂av免费观看 | 日本最大色倩网站www | 精品国产亚洲在线 | 亚洲精品在线观看视频 | 91免费观看视频网站 | 日韩午夜精品 | 欧美在一区 | 国产中文字幕在线视频 | 69人人 | 欧美日韩午夜爽爽 | 亚洲天堂免费视频 | 成人久久免费视频 | 精品一区在线看 | 欧美精品乱码久久久久久 | 99国产在线观看 | 国产一级二级三级在线观看 | 国产高清在线精品 | 精品一区二区影视 | 国产剧情在线一区 | 在线免费观看亚洲视频 | 超级av在线 | 婷婷伊人综合亚洲综合网 | 伊人色综合久久天天网 | 精品国产免费久久 | 久久久久国产精品视频 | 五月天丁香亚洲 | 亚洲电影久久久 | 欧美伦理一区二区三区 | 91在线视频精品 | 精品女同一区二区三区在线观看 | 蜜臀久久99精品久久久酒店新书 | 欧美精品亚洲二区 | 91高清完整版在线观看 | 99久久超碰中文字幕伊人 | 色天堂在线视频 | 色偷偷网站视频 | 在线欧美最极品的av | 丁香花在线视频观看免费 | 日韩在线电影一区二区 | 蜜臀av.com| 国产无限资源在线观看 | 69成人在线 | 美女一区网站 | 国内久久精品视频 | 99色免费| 欧美精品乱码久久久久久 | 国产在线毛片 | www.日日操.com | 丰满少妇一级片 | 欧美日韩精品区 | 日韩一区二区三免费高清在线观看 | 久久久国产精品一区二区三区 | 久久久久久中文字幕 | 在线黄网站 | 国产精品欧美久久久久无广告 | 精品在线观看免费 | 天天干,狠狠干 | 成人精品视频久久久久 | 亚洲成av人影片在线观看 | 综合天天色 | 天天曰天天射 | 在线电影 一区 | 欧美日韩一区二区三区不卡 | 五月天婷婷在线播放 | 成 人 免费 黄 色 视频 | 久久国产精品系列 | 久久成人国产精品 | 美女啪啪图片 | 国产色婷婷精品综合在线手机播放 | 国产亚洲精品成人av久久ww | 美女免费视频一区二区 | 丁香婷婷色综合亚洲电影 | 欧洲一区二区在线观看 | 久久尤物电影视频在线观看 | 视频一区二区精品 | 国产日女人 | 成人av手机在线 | 日韩a在线 | 久色 网| 国产一级淫片免费看 | 成人av电影在线 | 久久国产精品免费观看 | 97超在线视频 | 日韩精品不卡在线观看 | 综合网天天色 | 麻豆视频免费在线 | 超碰在线9| 丁香婷婷色月天 | 日韩免| 啪一啪在线 | 国产999精品久久久久久绿帽 | 日韩电影在线观看一区二区 | 五月天亚洲综合小说网 | 看片的网址 | 91精品啪啪 | 日日夜夜草 | 日韩精品不卡在线 | 成人三级网址 | 久久人人爽爽人人爽人人片av | 久草视频手机在线 | 国产视频一区二区三区在线 | 日韩在线无 | 91精品视频网站 | 九色91av| 国产综合在线观看视频 | 西西444www大胆高清图片 | 99久久精品免费看国产四区 | 丁香激情五月 | 日韩超碰在线 | 奇米网444| 国产成人久久av977小说 | 精品国产精品国产偷麻豆 | 日韩有色| 日韩成人免费电影 | 永久中文字幕 | h文在线观看免费 | 亚洲精品在线一区二区三区 | 在线播放日韩 | 日韩欧美xxxx | 免费在线91| 黄色网在线播放 | 麻豆视频91 | 伊人va| 免费91麻豆精品国产自产在线观看 | 日韩网站免费观看 | 最新色站 | 欧美精品一区二区蜜臀亚洲 | 国产亚洲视频系列 | 九九热中文字幕 | 999久久久 | 国产精品丝袜久久久久久久不卡 | 五月色综合 | 精品久久久久久久久久久久久久久久 | 亚洲欧美成人网 | 色a资源在线 | 日韩亚洲在线观看 | 欧美一二三四在线 | 久久精品网址 | 久久久久久国产精品亚洲78 | 午夜国产一区二区 | 免费日韩一级片 | 亚洲国产欧美在线人成大黄瓜 | 97狠狠操| 又色又爽又黄 | 久久伦理网 | 91九色视频在线观看 | 91免费高清观看 | 一区二区欧美在线观看 | 特黄免费av | 国产色在线视频 | 91九色蝌蚪视频网站 | 激情综合五月婷婷 | 国产中文字幕一区二区 | 久草视频资源 | 欧美日韩亚洲精品在线 | 久久婷婷色| 中国美女一级看片 | 麻豆精品在线 | 久久大片网站 | 在线观看色视频 | 又长又大又黑又粗欧美 | 精品国产一二三四区 | 婷婷丁香色综合狠狠色 | 激情视频一区二区三区 | 久久影院午夜论 | 日本激情视频中文字幕 | 蜜臀久久99精品久久久无需会员 | 亚洲九九九在线观看 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 97色婷婷成人综合在线观看 | 五月天综合色激情 | 黄色小视频在线观看免费 | 欧美va天堂在线电影 | 国产精品久久久久四虎 | 免费观看日韩 | av综合站| 欧美在线视频不卡 | 亚洲精品一区二区三区新线路 | 天天操天天干天天插 | 中文字幕你懂的 | 欧美黑吊大战白妞欧美 | 久久欧美在线电影 | 日韩午夜小视频 | 国产麻豆电影在线观看 | v片在线看| 在线观看国产v片 | 天天天干 | 中文字幕在线观 | av中文字幕在线免费观看 | 亚洲天堂网在线播放 | 麻花传媒mv免费观看 | 日韩精品一区二区免费 | 亚洲免费国产视频 | 香蕉免费在线 | 中文av网| 国产麻豆视频在线观看 | 欧美孕妇与黑人孕交 | 中文字幕 成人 | 91av看片 | 亚洲码国产日韩欧美高潮在线播放 | 国产三级午夜理伦三级 | 四虎国产精品免费观看视频优播 | 免费精品| 四虎在线视频免费观看 | 久久精品永久免费 | 成人黄色在线播放 | 日韩在线不卡av | 久草9视频| 久久99久久99精品免费看小说 | www九九热 | 丁香花中文在线免费观看 | 成人精品一区二区三区中文字幕 | 在线观看亚洲a | 久久人人爽av | 久青草影院 | 超碰在线91 | 97视频免费在线看 | 91在线播放国产 | 国产一区二区三区免费在线 | 在线免费91 | 国产精品短视频 | 五月婷婷中文 | 亚洲日本成人 | 91日韩免费 | 国产精品一区二区在线播放 | 一区二区三区在线观看免费视频 | 天天干天天天天 | 成人黄色国产 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国产精品观看在线亚洲人成网 | 亚州精品天堂中文字幕 | 久草网视频在线观看 | 丁香色婷 | 九色视频网站 | 免费av福利 | 伊人va| 免费看黄20分钟 | 亚洲丁香日韩 | 99自拍视频在线观看 | 日韩有码中文字幕在线 | 日韩久久久久 | 日本中文字幕在线免费观看 | 精品v亚洲v欧美v高清v | 欧美日本中文字幕 | 91看片黄色 | 午夜精品一区二区国产 | 久久免费福利视频 | 美女视频免费一区二区 | 美女视频网| 日本在线成人 | 亚洲精品视频免费看 | 国产精品乱码久久久久久1区2区 | 久久高清国产视频 | 一区二区成人国产精品 | 日黄网站 | 国产做aⅴ在线视频播放 | 九九热在线免费观看 | 美女免费视频一区二区 | av日韩精品 | 天天干,天天草 | 国产亚洲精品久久久久久大师 | av中文电影 | 亚洲美女视频在线观看 | 亚洲成a人片77777潘金莲 | 日韩精品一区二区三区免费观看视频 | 久久手机视频 | 日韩视频免费在线 | 97精品视频在线播放 | 最近免费在线观看 | 欧美a级在线 | 不卡在线一区 | 91精品亚洲影视在线观看 | 天天在线视频色 | 日韩在线第一区 | 午夜精品一二三区 | 三级黄色在线观看 | 精品一区二区三区香蕉蜜桃 | 日韩中文在线电影 | 成人午夜电影在线播放 | 亚洲日本一区二区在线 | 国产原创在线 | 天天操综合网站 | 国产在线97| 狠狠狠狠狠狠 | 一区二区不卡在线观看 | 99精品国产一区二区三区不卡 | 国产成人久久精品77777综合 | 日韩在线高清免费视频 | 91亚洲精品久久久蜜桃借种 | 亚洲综合情 | 精品视频资源站 | 婷婷色中文 | 色在线视频 | www.狠狠插.com | 免费看片网页 | 伊人久在线 | 国产精品欧美久久久久无广告 | 高潮毛片无遮挡高清免费 | 午夜丰满寂寞少妇精品 | 久久久www免费电影网 | 国产午夜精品免费一区二区三区视频 | 久久99国产综合精品 | 免费久久网 | 国产一二区免费视频 | 91av社区 | 亚洲成年人av| 色婷婷亚洲精品 | 一区二区不卡 | 欧美在线观看视频免费 | 四川bbb搡bbb爽爽视频 | 天天操夜夜拍 | 国产精品系列在线观看 | 中文字幕高清 | 中文av资源站 | 色婷婷色 | 在线观看电影av | 国产又粗又硬又长又爽的视频 | 久久a国产| 波多野结衣网址 | 中文国产字幕 | 国产成人精品综合久久久久99 | 亚洲一区二区三区四区精品 | 在线av资源 | 视频一区二区精品 | 97狠狠操| 日韩一区二区三 | 日本黄色免费网站 | 夜夜躁日日躁 | 中文免费观看 | 久久午夜精品视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 日韩亚洲国产精品 | 久久久免费高清视频 | 国产日产精品一区二区三区四区的观看方式 | 91麻豆精品国产午夜天堂 | 黄色成人av网址 | 国产日韩精品在线观看 | 久久一区二区三区超碰国产精品 | 久久九九国产视频 | 国产福利一区二区三区在线观看 | 超碰国产人人 | 青青射 | 久草在线视频免费资源观看 | av免费观看在线 | 97国产在线观看 | 999毛片| 中文字幕在线视频精品 | 97超碰精品 | 综合色在线观看 | 国内精品久久久久久久97牛牛 | 成人激情开心网 | 日本中文字幕网 | 九九色综合| 日日操天天操狠狠操 | 四虎影视精品永久在线观看 | 日日操天天操狠狠操 | 国产亚洲久一区二区 | 黄色大片免费播放 | 91av观看| 日韩视频专区 | 精品国精品自拍自在线 | 日日干综合 | 狠狠色丁香婷综合久久 | 国产高清免费在线播放 | 日韩在线视频观看免费 | 激情五月婷婷激情 | 91一区二区三区久久久久国产乱 | 国产资源网站 | 成人av在线网| 永久免费毛片 | 午夜电影久久久 | 日韩高清二区 | 亚洲一区二区三区四区精品 | 久 久久影院| 一级欧美黄 | 国产一级二级视频 | 啪啪av在线 | 免费看色的网站 | 亚洲综合视频网 | 激情自拍av | 9797在线看片亚洲精品 | 精品视频资源站 | 国产中文字幕在线免费观看 | 狠狠干激情 | 91精品国产自产老师啪 | 深夜国产在线 | 射久久久 | 精品1区2区3区 | 国产做a爱一级久久 | 91精品在线麻豆 | bayu135国产精品视频 | 91porny九色91啦中文 | 公与妇乱理三级xxx 在线观看视频在线观看 | 99久久久久成人国产免费 | 福利视频导航网址 | 日韩欧美99 | 久草资源免费 | 精品国产网址 | 视频 国产区 | 国产无套精品久久久久久 | 久久久久亚洲天堂 | 国产偷国产偷亚洲清高 | av福利第一导航 | 四季av综合网站 | 免费三级av| 综合中文字幕 | 午夜视频在线瓜伦 | 欧美aaaxxxx做受视频 | 国产视频在线观看一区 | 国产一在线精品一区在线观看 | 国产精品videossex国产高清 | 亚洲最新在线视频 | 国产日韩一区在线 | 91黄色小网站 | 中文永久字幕 | 成人91av | 美女视频黄免费 | 国产成人333kkk | 国产黄色一级大片 | 国产精品黄色 | 国产黄色理论片 | 韩日精品中文字幕 | 精品在线观看免费 | 亚洲激情中文 | 精品久久久亚洲 | 激情五月婷婷综合网 | 亚洲综合成人专区片 | 免费日韩 精品中文字幕视频在线 | 国产成人高清 | 一区二区三区不卡在线 | 五月婷婷一区 | 日日日日 | 色a网 | 亚洲精品美女久久久久网站 | 精品美女国产在线 | 欧美日本高清视频 | 日本aa在线| 在线观影网站 | 亚洲成人av在线电影 | 国产精品毛片一区二区 | 精品国产黄色片 | 国产视频久 | 久久精品超碰 | 少妇高潮流白浆在线观看 | 亚洲欧美精品一区 | 五月天亚洲激情 | 亚州视频在线 | 久久国产精品区 | 亚洲va欧美va人人爽春色影视 | 粉嫩一区二区三区粉嫩91 | 成人av在线网 | 色综合网| 狠狠插狠狠操 | 国产精品久久久久久久婷婷 | 欧美日韩在线播放 | 精品九九久久 | 国产成人av网址 | 免费观看xxxx9999片 | 国产在线精品一区二区三区 | 亚洲视频在线播放 | 色的网站在线观看 | 国产精品久久久久久电影 | 黄色网大全| 欧美国产高清 | 特级a老妇做爰全过程 | 91香蕉视频黄 | 日韩视频1区 | 欧美极品xxxxx | 蜜桃av观看| www.狠狠操.com| 欧美精品视 | 亚洲精品久久久蜜臀下载官网 | 国产最新在线视频 | 97人人模人人爽人人喊网 | 狠狠色丁香久久综合网 | 一区二区三区动漫 | 伊人小视频 | 国产福利资源 | 五月天av在线 | 日韩激情综合 | 精品国产一区二区三区久久久 | 亚洲国产影院 | 色天天 | 亚洲精品在线观看的 | 日韩高清在线一区二区 | 亚洲国产字幕 | 久久亚洲福利视频 | 国产大陆亚洲精品国产 | 久久久免费观看完整版 | 国产色女人 | 欧美另类成人 | 国产视频在线免费 | 麻豆超碰| 国产日韩欧美在线播放 | 91在线在线观看 | 综合网av |