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

歡迎訪問 生活随笔!

生活随笔

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

C#

2018.8.14-C#复习笔记总

發布時間:2025/3/18 C# 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018.8.14-C#复习笔记总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2018.8.14-C#復習筆記總

using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using static System.Console; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Security.Permissions; using System.Net.Sockets; using System.Net;namespace ConsoleApplication1 {class Program{[DllImport("dltest.dll", EntryPoint ="Print")]static extern void xPrint(int x);#region old-test// static void TestStreamReadWrite(){//一個流不能兼備讀寫兩種操作,不知道為什么,這不合理string s1 = "你好啊ABC";var t = "你好啊ABC".Length;//關于編碼注意幾點://1,sizeof(char) 等于 2//2,str.Length 是以元素個數算的,不是按字節算的,如 "你好啊ABC” length = 6//3,c#在VS的默認編碼為 Encoding.Default, 該編碼下漢字占兩字節,非漢字占1字節,通過查看ms中的字節數據可知//4,string 類型寫入任何buffer時都是先寫長度,一般為1字節,再寫字節數據,如下var sz = sizeof(char); //2, 注意char占2字節var szb = sizeof(bool); //1var ms = new MemoryStream();var writer = new BinaryWriter(ms, Encoding.UTF7);writer.Write(s1);ms.Close();writer.Close();var ms2 = new MemoryStream(ms.GetBuffer());var reader = new BinaryReader(ms2, Encoding.UTF8);var s2 = reader.ReadString();}// static void TestEncoding(){string s1 = "你好啊ABC";//漢字亂碼問題,漢字必須使用2個以上字節才能表示//編碼方式//1,ASCII碼,只有一個字節,不能正確表示漢字,出現亂碼,可以正確表示數字和字母符號//2,UNICODE,任何符號都用2個字節表示,因此可以表示漢字和任意符號//3,UTF8,變字節的編碼,可以正確表示任何字符和漢字,各國語言//4,GB2312編碼,國標碼,主要是為漢字服務的中國編碼,漢字占兩字節,字母數字占1字節//5,default編碼,在國內, 般就是GB2312 Encoding.Default.GetBytes(s1);var bytes = Encoding.GetEncoding("GB2312").GetBytes(s1);var len = bytes.Length;var bts = new byte[10 + len];Array.ConstrainedCopy(bytes, 0, bts, 0, len);var s2 = Encoding.GetEncoding("GB2312").GetString(bts).TrimEnd('\0');string s3 = "\0hello/0/0dddddd".TrimStart('\0');//!!!!!!!!!!!!!!!!!!!!!!!!!!!! }#region 計算機中數據的存儲// static void TestTypeConvert(){//把一個有符號數轉為無符號后再轉回來值保持不變,以下以1字節為例//原理:計算機中符點數都是有符號的,不存在這種轉變,只剩下整數,//真值:絕對值的二進制值,如-1的真值為 00000001//整數是以補碼形式存放的,計算機規定了正數的補碼是本身,負數的補碼是:符號位不變,真值按位取反再加1//強制轉換做的事就是把一個補碼看成是有符號還是無符號//有符號數,在計算時:符號位不變,真值按位取反再加1。無符號數直接計算,舉例如下://1,-1 的真值為00000001,補碼為 1 111 1111,強轉時就是把補碼值看作是一個無符數,因此它=255//,再次強轉時把它看成有符號數,符號位不管,其余位按位取反加1后是1,因此再次轉回了-1//2,-2 的真值為00000010,補碼為 1 111 1110,強轉時把補碼看作無符號數,因此它=254//3,-128真值有點特殊,128的二進制碼為1000 0000,第8位是符號位,舍棄,取后面的0,即-128的真值為0//補碼經按位取反加1后還是 1 000 0000,強轉時看成無符號數即為128//-------------------------------------------//1字節數據和2字節數據進行加法運算時,要進行位擴展,將1字節擴展為2字節//正數擴展時高位補0,負數擴展時高位補1//C#中小于4字節的數據進行運算時會先擴展成int再進行sbyte sb = -127;var b = (byte)(sb);var sb1 = (sbyte)(b);object dx = 10.0f;double dx2 = 33;byte ix = (byte)dx2;var t = dx.GetType();Type T = System.Type.GetType(t.FullName, true);}#endregion// void TestUncheck(){unchecked{//不被編譯系統做編譯時安全檢查 }}static void TestBoxing(){int i = 10;object o = 1;int i2 = (int)o;}static void TestReadBytes(){byte[] bts = new byte[4] { 23, 0, 16, 0 };var ms = new MemoryStream(bts);var br = new BinaryReader(ms);var p1 = ms.Position;var ix = br.ReadUInt32();var p2 = ms.Position;Console.WriteLine("num=" + ix);br.Dispose();br.Close();ms.Dispose();ms.Close();}static void TestStrEnd(){string str = "abcde\0";var br = new BinaryReader(new MemoryStream(Encoding.ASCII.GetBytes(str)));var b = br.ReadByte();while (b != 0){Console.WriteLine(b);try{b = br.ReadByte();}catch (System.Exception ex){Console.WriteLine("未發現字符串結束符");break;}}}static void TestBigEndia(){var br = new BinaryWriter(File.Create("f:/testx.dt"), Encoding.ASCII);br.Write((Int16)9);string str = "Stand";br.Write(str);br.Write((Int16)10);br.Write((Int16)70);br.Dispose();}static void TestChar0(){//注意字符串中0和\0的區別,如 s1="h0ello", s2 = "h\0ello"//s2中的\0是字符串結尾符,除了C#不把它作為結束符外,其它語言都把它作為結束符,如U3D,LUA,C/C++等//而s1中的0僅是一個字符0而已,字符0的ASCII值是0X31=49,'\0'的ASCII值是0//注意這兩種0在C#和U3D的API之間切換時容易造成BUG,如://1, debug.log(s1): "h0ello"//2,debug.log(s2): "h"var s = "hello";s += 0 + ",world";var s1 = "hello";s1 += (char)0 + ",world";var s2 = "hello";s2 += '\0' + ",world";}static void MemTest(){}static void ReflectionTest(){//測試兩種反射的效率問題//Type.GetType()只能在同一個程序集中使用,typeof則可以跨程序集(assembly)//通過下面的實測,發現typeof是比GetType快40多倍var timer = Stopwatch.StartNew();timer.Start();Type tx = Type.GetType("string");var tx1 = Type.GetType("float");timer.Stop();Console.WriteLine("T1= " + timer.Elapsed);//0.0000471 timer.Restart();tx = typeof(string);tx1 = typeof(float);timer.Stop();Console.WriteLine("T2= " + timer.Elapsed);//0.0000011 }static void TestDelegate(){//類C++11風格:指定初始化容量20,使用初始化列表給部分成員賦值var lst = new List<float>(20) { 1, 3, 4, 20, -2, 9, 0 };for (var i = 0; i < lst.Count; ++i){//使用下標進行隨機訪問,說明list不是一個真正的鏈表,而是類似STL的Vector Console.WriteLine(lst[i]);}//public void Sort (Comparison<T> comparison) //public delegate int Comparison<T>(T x, T y);//這是對調用List<int>.Sort進行排序的寫法,其中sort的定義及Comparison委托的定義如上lst.Sort(new Comparison<float>(delegate (float m1, float m2) //委托 {return 1;}));lst.Sort(delegate (float m1, float m2) //委托 {return 1;});lst.Sort((float m1, float m2) =>//Linq表達式 {return 1;});lst.Sort((m1, m2) => //Linq表達式 {return 1;});}static string TestRetStr(){//測試返回字符串是否會復制return "helloworld";}static void TestStrRet(){//h1 = h2 = h3說明它們返回的是同一個字符串的引用var s1 = TestRetStr();var s2 = TestRetStr();var s3 = TestRetStr();var h1 = s1.GetHashCode();var h2 = s1.GetHashCode();var h3 = s1.GetHashCode();}static void TestVirtualFuncCall(){var otx = new CTestChildX();otx.Update();//輸出結果:child,如果注釋1處函數不加override,輸出結果為:basevar oty = new CTestY();oty.Update();oty.OnUpdate();}static void TestStrModify(){var s1 = "hello";var s2 = s1;s1 += "world";Console.WriteLine(s2);var uns1 = s2.GetHashCode();Console.WriteLine(uns1);}static void Tests1(){var s1 = "hello";var uns1 = s1.GetHashCode();Console.WriteLine(uns1);}#endregion#region 2018.3.30#region ref out and templateclass myTemp<T1, T2>//類入口 {public T1 Add(T1 a, T1 b){//模板類型不能直接相加,必須先轉為動態類型,避開編譯檢查,運行時動態決定類型dynamic da = a;dynamic db = b;return da + db;}public void tint<T3>()//注意C++不能這么寫,所有模板參數必須由類入口傳入 {Type t = typeof(T3);WriteLine(t);}}delegate void refOutFunc(ref double t1, out double t2);delegate T TemplateDelegate<T, U>(T a, U b);static void TestRefAndOut(){//ref, out 本質上都是引用//fef就為了傳給函數使用,必須先初始化,但也可以傳出數據,out是為了從函數中傳出數據使用,不用初始化refOutFunc rof = delegate (ref double ax, out double bx) {ax = 1; bx = 2;//ref out兩種類型的變量都被更改了 };double x1 = 0, x2;rof(ref x1, out x2);}static void TestTemplate(){var otp = new myTemp<int, int>();otp.tint<object>();}static T TempFunc<T, U>(T a, U b){return a;}static void TestBufAligin(){//自定義字節BUF的對齊測試int x = 9;int y = (x + 7) & ~7;WriteLine(y);}#endregion#endregion#region 2018.4.9//BUG??????//使用StopWatch測試運行時間//兩段測試A和B//測試結果受測試順序影響,后測要比先測耗時長了許多static void TestKeyIntStr(){// var idict = new Dictionary<int, string>();var sdict = new Dictionary<string, string>();for (int i = 0; i < 1000000; i++){var key = i * 2 + 1;var v = i * i + "";idict.Add(key, v);sdict.Add(key + "", v);}//測試 Avar t1 = 100000 * Test1(idict);//測試 Bvar t2 = 100000 * Test2(sdict);Console.WriteLine("t1: {0},t2: {1}", t1, t2);//Console.WriteLine("dt1: {0},dt2: {1}", dt1, dt2); }static float Test1(Dictionary<int, string> dict){var timer = new Stopwatch();timer.Start();var it = dict[2001];var t1 = timer.ElapsedTicks;timer.Stop();return (float)((float)t1 / Stopwatch.Frequency);}static double Test2(Dictionary<string, string> dict){var timer = new Stopwatch();timer.Start();var it = dict["2001"];var t1 = timer.ElapsedTicks;timer.Stop();return (float)((float)t1 / Stopwatch.Frequency);}#endregion#region 2018.7.7#region 數組的數組,二維數組static int[] returnArray(){//數組是引用類型,分配在堆上int[] arr = { 1, 2, 3, 4 }; //雖然這樣寫,其實等價于int[] arr = new int[]{1,2,3,4};return arr; //返回一個數組對象 }static void TestArray() {//1,一維數組char[] arr = new char[2] { 'a', 'b' }; //必須全部初始化,或不初始化int[] iarr = new int[2] { 0, 1 };char[] sarr = new char[3];//2,數組的數組,鋸齒數組char[][] d2arr = new char[2][];d2arr[0] = new char[30];d2arr[1] = new char[2] { 'a', 'b' };d2arr[0][1] = 'x';//3,二維數組,矩陣int[,] i2arr = new int[2, 3];for (var i = 0; i < 2; ++i){for (var j = 0; j < 3; ++j){i2arr[i, j] = i * 3 + j;}}}#endregion#region 字段初始化無法使用非靜態(字段、方法、屬性)delegate int mydelegate(int x);//-------------------------------------------------------------------------//字段初始化無法使用非靜態(字段、方法、屬性)//-------------------------------------------------------------------------float fxs;static float sfxs;//float fxs2 = fxs; //errorfloat fxs3 = sfxs; //right,可用靜態字段初始化float fxs4 = TestStaticInit(); //right,調用靜態函數初始化static int TestStaticInit() { return 10; }mydelegate _mydel = (x) =>//LINQ為什么可以?,從下面可知,LINQ語句只相當于一堆初始化語句的集合 {//int fx = fxs; //errorreturn 20;};#endregion#region 默認訪問修飾符//1,名字空間中,最外層類及接口的默認修飾符為internal,也就是本程序集可訪問//2,類中,變量,成員,類中類的默認修飾符為private//3,結構中,同類//4,接口中,所有方法和屬性都為public,接口中只能有方法,不能有變量interface IMyinterface{//接口中可以有方法,抽象屬性,不可以有變量int Id { get; } //抽象屬性,公有void Fly(); //方法,公有 }#endregion#region 類模板繼承class CTClass<t1, t2, t3> //多個where的寫法where t1 : struct //必須是值類型where t2 : class //必須是引用類型where t3 : new() //必須有無參構造函數 {float fx, fy;public static t1 Add(t1 a, t1 b){return (dynamic)a + (dynamic)b;}}//模板繼承的幾種方式//1,全特化class CDTClass : CTClass<int, CCmpBase, CCmpBase> { }//2,原樣繼承,注意基類的所有約束都要重寫一遍class CDTX<t1, t2, t3, t4> : CTClass<t1, t2, t3>where t1 : struct //必須是值類型where t2 : class //必須是引用類型where t3 : new() //必須有無參構造函數 { }//3,偏特化,介于二者之間的形態#endregion#region 運算符重載class CCmpBase{//帶有默認構造函數float _x;}class CComplex : CCmpBase{float real, image;public CComplex(float real, float image = 0){this.real = real;this.image = image;}//一,類型轉換 :數值轉對象//CComplex cp = 2.1f 或 CComplex cp; cp = 2.1f;//C#從不調用類型轉換構造函數進行類型轉換public static implicit operator CComplex(float real){return new CComplex(real);}//二,類型轉換:對象轉boolpublic static explicit operator bool(CComplex cp){return cp.real != 0 && cp.image != 0;}//三,類型轉換:對象轉數值public static implicit operator float(CComplex cp){return cp.real;}//四,算術運算符重載 : +,-,*,/,%等//c#的運算符重載全部為靜態函數,因此沒有隱含參數//而C++運算符重載時可以重載為友元,絕大多數重載為類的成員函數,因此基本都有一個隱含參數(對象本身)public static CComplex operator +(CComplex a, CComplex b){return new CComplex(a.real + b.real, a.image + b.image);}public static CComplex operator ++(CComplex cp){cp.real++;cp.image++;return cp;}//五,不支持的運算符重載//1,不允許重載=運算符, C++可以,都不允許重載+=之類的//2,不允許重載括號()運算符//3,不允許重載[]運算符,因為它是索引器//public static implicit operator () (CComplex cp)//{// return a;//}void TestPrivate(){var cp = new CComplex(1, 3);cp.real = 20;cp.image = 30.0f;}public void PrintInfo(){WriteLine("real:{0},image:{1}", real, image);}}static void TestOperatorOverload(){CComplex cp = new CComplex(1, 1);//1,同時支持前后向++,【不同于C++】cp++;++cp;//2,但不允許連++, 【不同于C++】//cp++++或 ++++cp cp.PrintInfo();//3,支持連續+,【同于C++】CComplex cp1 = new CComplex(1, 1);var cpadd = cp + cp1 + cp1 + cp1;cpadd.PrintInfo();//類型轉換運算符cp = 2.1f;//類型轉換運算符//C++中是調用類型轉換構造函數,而不是運算符重載CComplex cp2 = 1.0f;}#endregion#endregion#region 2018.7.11#region 兩數相加函數模板實現static T MaxNum<T>(T a, T b){return ((dynamic)a > (dynamic)b) ? a : b;}#endregion#region thread lock//thread testclass Account{private object thisLock = new object();int balance;Random r = new Random();public Account(int initial){balance = initial;}int Withdraw(int amount){if (balance < 0){throw new Exception("Negative Balance");}lock (thisLock){if (balance > amount){WriteLine("before-withdraw: " + balance);WriteLine("amount to withdraw: " + amount);balance -= amount;WriteLine("after withdraw: " + balance);return amount;}elsereturn 0; //transaction rejected }}public void DoTransactions(){for (int i = 0; i < 100; ++i){Withdraw(r.Next(1, 100));}}}static void TestObjectLock(){Account acc = new Account(1000);Thread[] threads = new Thread[10];for (int i = 0; i < 10; ++i){threads[i] = new Thread(acc.DoTransactions);}for (int i = 0; i < 10; ++i){threads[i].Start();//threads[i].Join(); }}#endregion#region derive protectedclass A{float fxPrivate;protected int nProtected;protected A(int x) { }}class B : A //c++的公有繼承 {B(String name, int x) : base(x) { }protected int nProtected;void TestDerive(){//這里的規則與C++完全一樣://1,子類不能訪問基類的私有成員,可以訪問基類的保護和公有成員//2,保護成員可以在本類中訪問(不一定是本對象中)nProtected = 20;base.nProtected = 10;var ob = new B("b", 1);ob.nProtected = 30; //類中訪問類的保護成員,但不是本對象的成員 }}#endregion#endregion#region 2018.7.12#region 常量和靜態變量靜態類readonly//----------------------------------------------------------------------//常量和靜態變量,靜態類//----------------------------------------------------------------------//類的靜態變量和常量,都屬于類而不屬于對象,不能用對象來調用,只能用類名調用//這不同于C++,是更合理的設計//常量的值在類定義時就確定了,不因對象而不同,因此存放在類中更合理class CNormclass{class CInclass{public float fx = 20;}public int _id;public const string cname = "CNormalclass";//1,常量僅能修飾 :數字,bool,字符串,null引用//不能像C++那樣定義一個常量對象,這真是太悲哀了,因為很多時候這可以加速數據傳遞,增加安全性//由于這個原因,C#的List.ToArray每次都只能返回一個內部數組的拷貝,因此使用list存儲數量較大較復雜的數據時//不要輕易使用ToArray,直接用List就行了,它也支持下標索引方式取數組元素const CInclass lst = null;//2,readonly也不能實現常量對象的效果//readonly僅表示變量本身不能被賦值,但不阻止通過對象變量更改對象內的字段//onc.readonlyobj.fx = 20public float fx = 20;private readonly CInclass readonlyobj = new CInclass();public void FuncX() { }//3, 屬性不能用readonly修飾virtual public int ReadonlyProp {//4,屬性可以為虛private set; //可以加限定符get;}public static void Test(){//1,不能調用非靜態字段或方法//this._id = 20; //error,沒有this指針//2,可以調用常量字段var lname = cname;var onc = new CNormclass();//私有變量在類的靜態方法也可以訪問//2,雖然不能更改readonlyobj本身的值,卻可以更改其內部成員的值,這就是readonly的作用onc.readonlyobj.fx = 20; }}static class C712//類中類,默認為私有{//靜態類不能實例化,且只能聲明:常量,靜態常量,靜態屬性,靜態方法public const int constX = 20; //1,常量public static int staticX = 0; //2,靜態常量public static int ix { set; get; } //3,靜態屬性//一,【靜態類中不能定義實例化字段】//public int _id; //二,【靜態類中不能定義實例化字段】//void Ctest(){ //【error: 靜態類中不能定義實例化方法】// this._id = 20;//}static void Test()//4,靜態方法 {//三,【靜態方法中不能調用非靜態變量或方法,因為沒有this指針】//_id = 20; //error //四,【可以調用常量字段,這與C++不同】var c = constX;}}public const int ixd = 20;public static float fx = 20;public void Testff(){fx = 30; //等價于Program.fx = 30,而不是 this.fx = 30;Program.fx = 30;var tx = C712.constX;C712.staticX = 30;var ix = Program.ixd;//var oc7 = new C712(); //error 靜態類不能創建實例 }#endregion#region 事件和委托//--------------------------------------------------------------//event -test//--------------------------------------------------------------//使用event的好處,與delegate的區別://event 本質上是一個委托,是做了一些安全措施的委托//1,event 定義的委托只允許 +=操作,不允許=賦值,這樣防止事件被誤清空,delegate則沒有這些限制//2,event 定義的委托只能在本類中調用,可以防止外部觸發,delegate沒有這些限制//3,不使用事件,delegate方式完全可以實現類似限制,通過私有變量和公有函數結合方式class EventTest{public delegate void Delx(string s = "");Delx _delegate; // 私有委托,防止外部調用public event Delx _event; //公有事件,給外部通過+=注冊使用,但_event()函數只能在本類調用,不能在類外調用//-------------------------------------------------------------//1 ,委托方式//-------------------------------------------------------------//(1)外部調用eventTest.AddListener(func)方式注冊事件public void AddListener(Delx callback){_delegate += callback;}//(2)本類對象調用此函數觸發事件void DelegateBrocast(){_delegate("delegate"); //回調,觸發事件 }//-------------------------------------------------------------//2,事件方式//-------------------------------------------------------------//(1)外部使用 _event += 方式注冊回調函數//(2)本類對象調用此函數觸發事件void EventBrocast(){_event("event");//回調,觸發事件 }}class Listener{public void OnEvent(string s){WriteLine("on-event---------------" + s);}}static void TestEventAndDelegate(){Listener l1 = new Listener();EventTest test = new EventTest();//1,事件方式test._event += l1.OnEvent; //注冊事件//test._event = l1.OnEvent; //編譯錯誤,事件只能使用+=,防止事件被清空//test._event("event"); //編譯錯誤,事件不能在類外調用,事件只能由其所在類調用//2,委托方式test.AddListener(l1.OnEvent); //注冊委托,通過函數對委托進行注冊,因委托是私有的,可防止直接操作 test._delegate() }#endregion#region 文件和目錄static void FileAndDirectory(){//-------------------------------------------------------------------------//文件對象的相關操作//-------------------------------------------------------------------------//方式一,使用工具類:File類,不需生成對象var file = File.Open("f:/test.txt", FileMode.Create, FileAccess.ReadWrite);//方式二,通過FileStream的對象var filestream = new FileStream("f:/test._txt", FileMode.Create, FileAccess.ReadWrite);//-------------------------------------------------------------------------//目錄文件相關操作//-------------------------------------------------------------------------//方式一,實例化DirectoryInfo類var dir = new DirectoryInfo("f:/tolua");//(1)獲取目錄foreach (var d in dir.GetDirectories("*.*", SearchOption.AllDirectories)){WriteLine(d.FullName);}//(2)獲取文件foreach (var fileinfo in dir.GetFiles("*.*", SearchOption.AllDirectories)){WriteLine(fileinfo.FullName);}//方式二,使用工具類: Directory類,不需生成對象//(1)獲取目錄var dirs = Directory.GetDirectories("f:/tolua", "*.*", SearchOption.AllDirectories);//(2)獲取文件dirs = Directory.GetFiles("f:/tolua", "*.*", SearchOption.AllDirectories);for (int i = 0; i < dirs.Length; ++i){//打印輸出 WriteLine(dirs[i]);}}#endregion#endregion#region 2018.7.17#region 計算機中浮點數的存儲static void TestFloat(){using (var ms = new MemoryStream()){using (var br = new BinaryWriter(ms)){br.Write(125.5f);var bytes = ms.GetBuffer();}}unsafe{float fx = 125.5f;int* pfx = (int*)(&fx);}}#endregion#region 位移運算static void TestBitShift(){ //----------------------------------------------------------------------------//十進制數轉二進制://1,原理:將數X右移1位,最低位被移出,再左移,得到了數X0,則x-x0即為最低位的值//2,手工算法:根據1的原理,不斷的對一個數整除2得余數,了終得到余數序列即是二進制的反向序列//3,左移等價于乘2,右移等價于除2,原理是乘法的豎式算法,// 101//x 010//------- 豎式算法適用于任何進制的加減法和乘法運算// 000//+101//-------// 1010//----------------------------------------------------------------------------int x = 7;List<Byte> bits = new List<Byte>(4);while (x != 0){var left = x - ((x >> 1) << 1);//<=> x - x/2*2bits.Add((byte)left);x = x >> 1;}}#endregion#region IEnumerableAndLinQclass Product{public int cateId;public string name;}class Category{public int id;public string name;}public static void TestIEnumerableAndLinq(){Category[] cates = new Category[]{new Category{id = 1, name = "水果"},new Category{id = 2, name = "飲料"},new Category{id = 3, name = "糕點"},};Product[] products = new Product[]{new Product{cateId=1, name = "apple"},new Product{cateId=1, name = "banana"},new Product{cateId=1, name = "pear/梨"},new Product{cateId=1, name = "grape/葡萄"},new Product{cateId=1, name = "pineapple/菠蘿"},new Product{cateId=1, name = "watermelon/西瓜"},new Product{cateId=1, name = "lemon/檸檬"},new Product{cateId=1, name = "mango/芒果"},new Product{cateId=1, name = "strawberry/草莓"},new Product{cateId=2, name = "bear/啤酒"},new Product{cateId=2, name = "wine"},new Product{cateId=3, name = "cake"},new Product{cateId=3, name = "basicuit/餅干"},};var rets = cates.Where((x) => { return x.id > 1 && x.id < 5; });var iter = rets.GetEnumerator();while (iter.MoveNext()){//WriteLine(iter.Current); }var set = from c in cates//這里只能寫一個條件,就是equals,用來關聯兩個表//并且 c相關的條件只能寫在equals左邊,p相關條件只能寫equals右邊join p in products on c.id equals p.cateId//這里存放的是 products中的元素合集,而不是cates中的元素合集//如果 from p in products join c in cates on c.id equals p.id into xgroups//則xgroups中放的是cates中的元素集合//這里是說將products中cateId等于c.id的所有元素放入一個組xgroups中 into xgroupsorderby c.id descending //對set中的結果進行降序排列//where m > 4 && m < 10 //這里就可以寫多個條件了//from in 相當于外層循環,join in 相當于內層循環//select在雙層循環體中,每執行一次循環,【如果符合條件】,則執行一次結果選擇//雙層循環完成后,最終將很多條選擇提交給set//【注意,如果不符合條件 select不會執行】select new { cate = c.name, grp = xgroups }; //可以生成一個新的對象foreach (var p in set){WriteLine("分組:" + p.cate);foreach (var g in p.grp){WriteLine(g.cateId + "," + g.name);}}}#endregion#region 類和繼承class CTestX{public virtual void OnUpdate(){Console.WriteLine("base-on-update");}public virtual void OnUpdate2(){Console.WriteLine("base-on-update2");}public void Update(){this.OnUpdate(); //注釋1,如果子類有overide則調用子類的,否則調用自己的 }public CTestX(){}protected CTestX(float fx){WriteLine("CTestX");}~CTestX(){WriteLine("~Ctestx");}public float fx;string name;}//子類不能訪問基類任何私有的東西,包括方法,字段,屬性,但它們都被繼承了,屬于子類,從實例內存可證//方法包括構造函數,即當基類是私有構造函數時,子類無法在初始化列表中調用base()來初始化class CTestChildX : CTestX{CTestX otestx;public CTestChildX() : base(1)//當基類為私有構造時,這里base無法調用{//當基類沒有無參構造函數時,必須在初始化列表中初始化所有成員對象,如otestxWriteLine("CTestChildX");}//注意overide與virtual的區別://1,overide : 表明【函數是對基類的重寫】 且 【本身是虛函數可被子類重寫】//【函數會與基類、子類發生虛函數機制】//2,virtual : 僅表明函數是個虛函數,不會與基類發生虛函數機制//如果子類overide了該函數,則會與子類發生虛函數機制//3,多級繼承中只要有一級沒override,虛函數機制就會打斷在此層級,見//override在編譯層的機制是重寫虛函數表中的函數地址//即將繼承而來的虛函數表中的虛函數地址替換成本類的虛函數地址public static void TestDerive(){// CTestX ox = new CTestChildX();// ox.OnUpdate(); //base-on-update,無虛函數機制發生// ox.OnUpdate2(); //child-on-update2,虛函數機制發生// ox = new CTestY();// ox.OnUpdate(); //base-on-update,無虛函數機制發生CTestChildX ocx = new CTestZ();ocx.OnUpdate(); //grand-child-on-update }public override void OnUpdate(){Console.WriteLine("child-on-update");}public override void OnUpdate2(){Console.WriteLine("child-on-update2");}~CTestChildX() //不支持virtual {WriteLine("~CTestChildX");}}class CTestY : CTestChildX{public override void OnUpdate(){Console.WriteLine("grand-child-on-update");}}class CTestZ : CTestY{//因為這里的Update不是虛函數,因此public void OnUpdate(){Console.WriteLine("grand-grand-child-on-update");}}struct CTX{void Test() {//不支持C++的const語法 }}//1,不能繼承結構,可以實現接口,//2,不能有虛函數struct CCTX //: CTX {public void Test(){}}#endregion#region 字符串格式化static void TestStrFormat(){var str = Console.ReadLine();while (str != "exit"){int ix;Int32.TryParse(str, out ix); //ix = 120var f1 = string.Format("{0 :d5}", ix); //"00120"var f2 = string.Format("{0,-10:d5}", ix);//"00120 "var f3 = string.Format("{0:x}", ix); //16進制輸出到字符串var f4 = string.Format("{0:0.000}", ix);//浮點數 120.000Console.WriteLine("-----------begin-------------");Console.WriteLine(f1);Console.WriteLine(f2);Console.WriteLine(f3);Console.WriteLine(f4);Console.WriteLine("------------end-------------");str = Console.ReadLine();}}#endregion#endregion#region 2018.7.25#region 引用返回值(不是右值引用)static int[] _bookNum = new int[] { 1, 2, 3, 4, 5, 6 };static ref int GetBookNumber(int i){int x = 10;return ref _bookNum[i];}static void TestRefReturn(){ref int rfn = ref GetBookNumber(1);rfn = 10101; //_bookNum[1]變成了 10101int vn = GetBookNumber(2);vn = 202; //_bookNum[2]未變,仍為3ref int x = ref vn;}#endregion#region 索引器class mylist<T>{const int defaultCap = 4;T[] items;int count;int cap = defaultCap;public mylist(int cap = defaultCap){if (cap != defaultCap)this.cap = cap;items = new T[cap];}public T this[int idx] {set {items[idx] = value;}get {return items[idx];}}}enum Color{red,green,blue,yellow,cyan,purple,black,white,}static void TestIndexer(Color clr = Color.black){mylist<string> lst = new mylist<string>();lst[1] = "hello";}#endregion#region 部分類//部分類的作用是可以把一個龐大的類拆分到多個文件,每個文件實現一部分//而不是實現像C++那樣將聲明與實現分開//若要實現聲明(接口)與實現分開,應該使用抽象類或接口partial class CPartclass{public void ShowName() {WriteLine("show name");}}partial class CPartclass{public void ShowAge(){WriteLine("show age");}}static void TestPartclass(){CPartclass opc = new CPartclass();opc.ShowName();opc.ShowAge();}#endregion#region 動態分配對象數組C#與C++的區別struct xobject {public float fx, fy, fz; //全是public的 }static void TestDynamicAllocInCSharpCpp(){//1,對于引用類型數組,需要兩步才能完成,因為數組中存放的是對象的引用//1.1 c#中xobject[] arr = new xobject[2];//這時候,只是分配了一個引用數組,arr[0],arr[1]均為nullfor (int i = 0; i < 2 ; i++){arr[i] = new xobject(); //為數組中每個引用申請對象 }//1.2 c++中//xobject** pp = new xobject*[2];//pp[0] = new xobject();//pp[1] = new xobject();//2 對于值類型數組,則只需一步,因為數組中放的就是值,這在C#與CPP中都一樣//2.1 C#中int[] iarr = new int[2];var a0 = iarr[0]; //0var a1 = iarr[1]; //0 xobject[] varr = new xobject[3];varr[0].fx = 0.1f;varr[1].fy = 2.5f;varr[2].fz = 12;//2.2,在C++中//xobject* pobjs = new xobject[2]; //每個數組元素都是一個值類型對象//pobjs[0].fx = 20; }#endregion#region Object?語法static void TestobjAsk(){object obj = "hello";WriteLine(obj?.ToString());//如果obj不為null則調用tostring }#endregion#region C#默認字符編碼及系統默認編碼//默認編碼為unicode,字符串本身的編碼并不重要,字節讀寫時指定的編碼才重要,如下面的BinaryWriter//Encoding.Default是當前系統的默認編碼,并不是c#字符串的默認編碼//Encoding.Default規則:漢字2字節,其它1字節static void TestDefaultStrEncoding(){string str = "hdd好";using (var ms = new MemoryStream()){using (var br = new BinaryWriter(ms, Encoding.Default)){br.Write(str);var len = ms.Length-1;WriteLine(len);}}}#endregion#region 屬性attribute和反射class ReflectableClass{public float fx;public string str;//static const int x = 20; //這在C++中是可以的public void Printstr(string str, int idx){WriteLine(str + ":" + idx);}}static void TestReflect(){ReflectableClass ox = new ReflectableClass();Type t = typeof(ReflectableClass);//Type.GetType("ConsoleApplication1.Program.ReflectableClass");//ox.GetType();var tname = t.GetField("name");var tfx = t.GetField("fx");var func = t.GetMethod("Printstr", new Type[] {typeof(string),typeof(int) });func.Invoke(ox, new object[] { "helloworld", 1 });Type Ts = Type.GetType("System.String");var fs = Ts.GetMethod("Substring", new Type[] { typeof(int), typeof(int) });var subs = fs.Invoke("hello world", new object[] { 1, 5 });WriteLine(subs);}static void TestAttribute(){}#endregion#endregion#region 2018.7.30#region 擴展方法測試static void TestExtMethod(){ExtTargetCls oet = new ExtTargetCls();oet.methodExt(100);WriteLine(oet.sum);}#endregion#region 元組:同時傳遞多個不同類型參數//作用時,可以很方便的,高效的返回一組不同類型的值或對象//因為是泛型,所以高效//但是它最多只有8個參數,也就是說不能當作ArrayObject的替代品static void TestTuple(){Tuple<int, float> tupleFunx(){return new Tuple<int, float>(1, 2);}var tp = tupleFunx();WriteLine(tp.Item1);WriteLine(tp.Item2);}#endregion#region 數組排序:實現IComparable和傳遞排序函數//注意,List排序也是這樣的,因為它本身就是一個數組class ComparableObj<T> : IComparable{public T elem;public ComparableObj(T fx){elem = fx;}public int CompareTo(object obj){var objc = (dynamic)(ComparableObj<T>)obj;if (elem == objc.elem)return 0;else if (elem < objc.elem)return -1;return 1;}}static void TestCompareableobj(){var rand = new Random();ComparableObj<float>[] arrf = new ComparableObj<float>[10];for (var i = 0; i < 10; ++i){arrf[i] = new ComparableObj<float>(rand.Next(1, 100));Write(arrf[i].elem + " ");}WriteLine();//方式一,實現了IComparable,用它來排序,升序 Array.Sort(arrf);foreach (var a in arrf){Write(a.elem + " ");}WriteLine();//方式二,傳遞一個排序函數,使用它來排序,降序Array.Sort(arrf, (a, b) =>{if (a.elem == b.elem)return 0;else if (a.elem < b.elem)return 1;return -1;});foreach (var a in arrf){Write(a.elem + " ");}WriteLine();}#endregion#region 只讀集合void TestReadonlySet(){var lst = new List<int>();var rdlst = lst.AsReadOnly(); //生成一個包裝類,引用原來的lst,因此是高效的//rdlst[0] = 2; //error, read onlyvar llst = new LinkedList<int>();//這個才是鏈表,而list就像是c++的vector }#endregion#endregion#region 2018.7.31#region JSONvoid TestJson(){}#endregion#region CPP與CS間數據傳遞轉換#endregion#region 線程static void TestThread(){//Thread.Yield();Thread t1 = new Thread(() =>{int i = 0;while (i++ < 25){Thread.Sleep(300);WriteLine("T1>> " + i);}});Thread t2 = new Thread(() =>{//t1先執行(<=1000毫秒),t2等待t1.Join(1000);//t1,t2同時執行,若上一步t1已完成則不執行int i = 0;while (i++ < 10){Thread.Sleep(300);WriteLine("T2>> " + i);}//若t1還活著,繼續執行//t2是前臺線程,main函數會等待t2的結束 t1.Join();});t1.Start();t2.Start();t1.IsBackground = true;t2.IsBackground = true;//t1.IsBackground = true;//t2.Join();Thread.Sleep(2000);WriteLine("main-thread-end");}#endregion#region 線程池void TestThreadPool(){}#endregion#region 任務static void TestTask(){WriteLine("TestTask: " + Thread.CurrentThread.ManagedThreadId);//任務開啟方式一,實例實現var task = new Task(() =>{WriteLine("task: " + Task.CurrentId + "," + Thread.CurrentThread.ManagedThreadId);});task.Start();task.Wait(); //等待方式一Task.WaitAny(task); //等待方式二//任務開啟方式二,靜態方法實現var t1 = Task<string>.Run(delegate //Task<string>中的string表示返回值類型,也可不寫,由模板自動推導 {WriteLine("task1: " + Task.CurrentId + "," + Thread.CurrentThread.ManagedThreadId);Thread.Sleep(2000);return "suceed"; //返回值類型,對應Task<string>中的string,如果類型寫錯也沒關系 });t1.Wait(); //等待任務完成,因為是在主線程中調用的,因此是讓主線程等待任務完成,不寫的話主線程直接結束了WriteLine("線程1執行結果:" + t1.Result); //suceed }#endregion#region 程序集#endregion#region 多線程調試#endregion#region 委托綜合使用小例子static void delegateTestx0 (){void ifunc(int x, Func<int, int> dx){WriteLine(dx(2));}var lst = new List<int>() { 1, 2, 3 };foreach (var v in lst){ifunc(1, delegate (int x) {//像lua的回調函數那樣使用return v; //閉包中的v });ifunc(1, (x) => { return v; });}}#endregion#region 異步 async awaitpublic static async void AsyncFunc(){WriteLine(Thread.CurrentThread.ManagedThreadId); //主線程var task = Task.Run(() =>{for(int i= 0; i<10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task>>" + i); //線程1Thread.Sleep(100);}});var task1 = Task.Run(() =>{for (int i = 0; i < 10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task1>>" + i);//線程2Thread.Sleep(100);}});await task; //等待線程1完成await task1;//等待線程2完成WriteLine("task and task1 finished");var task2 = Task.Run(() =>{for (int i = 0; i < 10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task2>>" + i);//線程3Thread.Sleep(100);}});await task2;//等待線程3完成Task.WaitAll(task, task1, task2); //無效,因為代碼執行到這里時主線程已結束WriteLine("---------------------------------------------------");}public static void AsyncFunc2(){WriteLine(Thread.CurrentThread.ManagedThreadId); //主線程var task = Task.Run(() =>{for (int i = 0; i < 10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task>>" + i); //線程1Thread.Sleep(100);}});var task1 = Task.Run(() =>{for (int i = 0; i < 10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task1>>" + i);//線程2Thread.Sleep(100);}});task.Wait();//等待線程1完成task1.Wait();//等待線程2完成WriteLine("task and task1 finished");var task2 = Task.Run(() =>{for (int i = 0; i < 10; ++i){WriteLine(Thread.CurrentThread.ManagedThreadId + ":task2>>" + i);//線程3Thread.Sleep(100);}});task2.Wait();//等待線程3完成WriteLine("---------------------------------------------------");}//-----------------------------------------------------------------------//異步方式實現多個任務(線程)間的并發執行與順序執行//一個任務就是一個線程//await task 與task.wait的區別://task.wait會阻住當前線程,直到task執行完成,而await不會,它只表明了當前在任務會在task之后執行//-----------------------------------------------------------------------//方式一,采用 async-await方式實現//這種方式寫起來較優雅,但較抽象,且不知道所有任務的結束點,Task.waitAll對此無效static void TestAsyncAwait(){WriteLine(Thread.CurrentThread.ManagedThreadId); //主線程 AsyncFunc();WriteLine("after asyncfunc");//必須這樣等待任務結束,因為AsyncFunc中的Task.WaitAll無效//或者將每個任務都設置為前臺線程Thread.Sleep(3000); }//方式一,采用不使用 async-await關鍵詞,直接使用Task的基本功能來實現//這種方式更直觀,易于理解,且利于控制static void TestAsyncWait(){WriteLine(Thread.CurrentThread.ManagedThreadId); //主線程var task = Task.Run((Action)AsyncFunc2);WriteLine("after asyncfunc");task.Wait();}#endregion#region 正則表達式#region 貪婪匹配和最少匹配#endregion #region 分組 #endregion#endregion#region 正則在字符串中的使用static void TestRegexInStr(){var st = "hello;world;a";var mt = Regex.Match(st, ";world;");var ret = mt.Result(".");//???// string pattern = "--(.+?)--"; // string replacement = "($1)"; // string input = "He said--decisively--that the time--whatever time it was--had come."; // foreach (Match match in Regex.Matches(input, pattern)) // { // string result = match.Result(replacement); // Console.WriteLine(result); // } }#endregion#endregion#region 2018.8.1#region 異步調用Invokedelegate void MyTakeAwhileDelegate(int x, int time);static MyTakeAwhileDelegate a = invokefunc;static void invokefunc(int x, int time){WriteLine("begin invoke: " + Thread.CurrentThread.ManagedThreadId);//var str = Console.ReadLine();//WriteLine(">>" + str); Thread.Sleep(time);}static void TestInvoke(){// var iar = a.BeginInvoke(delegate(IAsyncResult ar) {// WriteLine("complete: " + ar.IsCompleted);// WriteLine("end invoke: " + Thread.CurrentThread.ManagedThreadId);// TestInvoke();// // }, null);//【線程的順序執行模式】//多個線程對同一函數進行順序訪問,不需要考慮線程同步問題,也不需要waitone等操作//不管系統會使用多少個線程來處理工作,但同時只有一個在執行,EndInvoke保證了這一點//這種模式在網游客戶端中很有用,客戶端只需要2個線程:一個主線程用于處理游戲邏輯與顯示畫面//另一個線程則用于與后端進行網絡通訊,這個線程就只需要使用【線程的順序執行模式】//來循環處理網絡消息:讀取網絡消息,阻塞等待讀取完成,然后再讀取網絡消息,阻塞等待讀取完成...while (true){//注意這里的參數與委托對應,而且多了兩個:callback, obj是系統加的var ar = a.BeginInvoke(1, 1000, null, null);a.EndInvoke(ar); //阻塞,只到線程執行完線程函數 }//a.EndInvoke(iar);//iar.AsyncWaitHandle.WaitOne(); }#endregion#region 初始化器class CInitclass{public CInitclass() { }public CInitclass(string name, int age){this.name = name; this.age = age;}public string name;public int age;}static void TestInitial(){var oc = new CInitclass { name = "jim", age = 14 };var oc1 = new CInitclass() { name = "jim", age = 14 };var oc2 = new CInitclass("tim", 13) { name = "jim", age = 14 };var oc3 = new { name = "jim", age = 14, sex = 1 }; //匿名對象int[] arr = { 1, 2, 3 };int[] arr2 = new int[] { 1, 2, 3 };List<int> lst = new List<int> { 1, 2, 3 };List<int> lst1 = new List<int>(10) { 1, 2, 3 }; //capacity = 10lst1.Capacity = 5;WriteLine(lst1.Capacity);lst1.ForEach((i) => WriteLine(i));var dict = new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" } };var dict1 = new Dictionary<int, string>() { { 1, "a" }, { 2, "b" }, { 3, "c" } };}#endregion#region 協變和逆變//協變發生在數組,模板,委托上,//父子類之間的轉換不是協變,不是逆變//轉變的前提是元素類型有父子關系,如 class A{}; class B : A{}; B b; A a;//若子群可以轉為父群,則稱為協變,如 A[] a = new B[10]//協變必須是在引用類型之間,值與引用類型之間是不能協變的,如 object[]和 int[]//雖然 object是int的父類,但 int 是值類型//再如 object[] strs = new string[10]是可以的,因為 object就string的父類且二者都是引用類型//======================================================================//總結:協變和逆變只是父子對象間轉換規則在模板,委托,數組上的表現//本質上還是子對象轉父對象,沒有父對象轉子對象的現象存在//模板類中的協變與逆變轉換過程較為抽象,難時一眼看出,解析方法是:用實際生成的對象去調用,在調用過程中分析//如下面的二例:【泛型委托中的協變逆變】和【泛型接口中的協變逆變】#region 普通協變逆變class tshape<T> { }class tcircle<T> : tshape<T> { }static void xiebianx(CTestX[] array){array = new CTestChildX[10];}static void TestXiebianNibian(){object[] ocs = new CNormclass[10];object[] strs = new string[10];//協變的一個陷阱,編譯時正常,運行時拋出異常: 類型不匹配strs[0] = 10;//泛型類本身的協變(有父子關系,泛型參數相同)tshape<int>[] tsps = new tshape<int>[10];tshape<CNormclass>[] tcs = new tcircle<CNormclass>[10];//通過函數參數測試普通類的轉變CTestX[] ox = new CTestX[10];xiebianx(ox);}#endregion#region 委托中的協變逆變class XIEBIAN{delegate CTestX[] ArrDelegate();CTestChildX[] func001(){return new CTestChildX[10];}delegate CTestX JustDelegate();CTestChildX func002(){return new CTestChildX();}void TEst(){ArrDelegate ad = func001;JustDelegate dd = func002;}}#endregion#region 泛型委托中的協變逆變delegate void FuncPtrin<in T>(T ox);//這里的in僅用來限制T類型,說明T只可用于輸入參數,而不能用于輸出。in與協變逆變無關。可以去除void testfuncptr1(CTestX ox){}delegate T FuncPtrout<out T>();//out限制T只能用于輸出參數,即返回值。與協變逆變無關??扇コ?/span> CTestX testfuncptr2(){return new CTestChildX();}void testfuncptr(){//泛型委托的協變比較抽象,其實,從它的【調用原理】來思考就很容易了FuncPtrin<CTestChildX> p1 = testfuncptr1;FuncPtrin<CTestX> p2 = testfuncptr1;//【調用原理】://1,p1的實參必須是T類型//2,p1的實參必須能傳入它指向的函數中p1(new CTestChildX());p2(new CTestChildX());p2(new CTestX());FuncPtrout<CTestX> p3 = testfuncptr2;CTestX otx = p3();//-----------------------------------------------------------------------//其實這里不存在什么所謂的逆變,只有一種規則:子對象可以轉為父對象//只要讓參數接收者和返回值接收者都是父對象,就可以了//----------------------------------------------------------------------- }#endregion#region 泛型接口中的協變逆變class CAnimal {}class CDog : CAnimal{}interface ISpeak<in T, out T2>//這里的in和out就是協變逆變的關鍵了,沒有它們編譯器不知道如何進行父子關系轉換 {T2 PrintInfo(T o);float fx { set; get; }}class Speaker<T, T2> : ISpeak<T, T2>where T2 : new() //必須有公有無參構造函數(或默認構造函數) {public float fx { set; get; }public T2 PrintInfo(T o){return new T2();}}void Test003(){ISpeak<CDog, CAnimal> speaker = new Speaker<CAnimal, CDog>();speaker.PrintInfo(new CDog());}#endregion#endregion#region 2018.8.2#region 相等比較static void TestVarEquals(){//--------------------------------------------------------------//C#中字符串都是常量,但在底層實現上還是C++的方式,分為常量字符串與變量字符串//1,以數組形式給出的字符串是變量字符串//2,以字符串形式給出的是常量字符串//每個變量字符串都有不同的地址,而一個常量字符串只有一個地址,它是全局的//如下sa, sb指向兩個地址不同而內容相同的字符串,sa1,sb1都指向同一個常量字符串"hello"string sa = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); //變量字符串string sb = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });//變量字符串string sa1 = "hello";//常量字符串string sb1 = "hello";//常量字符串WriteLine(sa.GetHashCode() + "," + sb.GetHashCode());WriteLine(sa.Equals(sb));//true,調用string.equals(string)WriteLine(sa == sb);//true,string的operator ==object oa = sa;object ob = sb;object oa1 = sa1;object ob1 = sb1;WriteLine(oa.Equals(ob));//true, 多態調用,實際調用的是string.Equals(object)WriteLine(oa1.Equals(ob1));//true, 多態調用,實際調用的是string.Equals(object)//運行時,打印sa,sb, sa1, sb1的地址,可以看到sa,sb中存放的地址不同,sa1,sb1中存放的地址相同// &sa// 0x000000000028ecb0// * &sa: 0x0000000002472ed8// & sb// 0x000000000028eca8// * &sb: 0x0000000002472f70// & sa1// 0x000000000028eca0// * &sa1: 0x0000000002472dc0// & sb1// 0x000000000028ec98// * &sb1: 0x0000000002472dc0WriteLine("ref equal : " + ReferenceEquals(sa, sb));WriteLine("ref equal : " + ReferenceEquals(sa1, sb1));WriteLine("oa == ob: " + (oa == ob)); //false,oa,ob中存放的地址不同WriteLine("oa1==ob1: " + (oa1 == ob1)); //true,oa1,ob1中存放的地址相同,都是常量字符串hello的地址 object oc = new object();object od = new object();WriteLine(oc.Equals(od)); //false, object.equals(object)WriteLine(oc == od);//false//如果沒有實現重寫,對于引用類型,那么原始的object.equals()與 ==沒有任何區別,二者總能得到一樣的結果//因為引用類型其實是一個指針,==比較的是指針的值,也就是地址,equals比較的也是地址。//string類重寫了==和equals,實現了字符串內容的比較,而非地址的比較。object o1 = new CNormclass();object o2 = new CNormclass();WriteLine(o1.Equals(o2)); //false, 多態調用, CDefOveride.Equals(object)int ia = 12;short isa = 12;WriteLine(ia.Equals(isa)); // true, short可以轉為int,故多態調用Int32.Equals(Int32 obj)WriteLine(isa.Equals(ia)); // false, int不能直接轉為short,故多態調用Int16.Equals(object obj) }#endregion#endregion#region 2018.8.3#region 線程同步#region 同步事件和等待句柄//https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/threading/thread-synchronizationstatic void TestWaitHandle(){//自動重置事件//一次只能激活一個線程,因為一旦激活后信號被自動置為了falsevar autoEvent = new AutoResetEvent(false);void tfunc(object o){WriteLine("worker thread " + (int)o + " started, now waiting on some event ... ");autoEvent.WaitOne();WriteLine("worker thread " + (int)o + " reactivated, now exiting...");}var threads = new Stack<Thread>();WriteLine("輸入創建 的線程數");var num = 1;while (!(int.TryParse(ReadLine(), out num))){}for(int i=0; i < num; ++i){var t = new Thread(tfunc);t.Start(i);threads.Push(t);Thread.Sleep(20);}Thread.Sleep(1000);while(threads.Count > 0){ReadKey();autoEvent.Set(); //發出信號,設置信號為true,一旦有線程被激活后,信息就被設置為了false threads.Pop();}}#endregion#region 一個線程終止另一個線程及信息傳遞異常捕獲class CThreadAbortInfo{public string info;public CThreadAbortInfo(string s){info = s;}}static void TestThreadAbort(){var t1 = new Thread(() =>{WriteLine("t1 started");try{int i = 0;while (true){Write(".");Thread.Sleep(200);i = i / 0;}}catch (DivideByZeroException e)//如果不處理,則系統會自己處理 {//throw; //讓程序引發異常,如果不寫,則程序正常運行,因為異常被丟棄了 }catch (ThreadAbortException ex)//如果不處理,程序正常運行 {var info = ex.ExceptionState as CThreadAbortInfo;if (info != null){WriteLine(info.info);}}});t1.Start();var t2 = new Thread(() =>{Thread.Sleep(1000);//調用這個函數,會拋出異常,但若不去捕獲,程序就什么都不會發生//拋出異常與顯示異常是不同的t1.Abort(new CThreadAbortInfo("t1 is terminated by thread t2"));});t2.Start();}#endregion#endregion#region as和引用類型轉換本質void Refcasttype(){//注意,不論是as轉換還是強制轉換都是在指針轉換,而不是對象轉換,遵守C++的規則:子類可以轉父類//C#中,父類也可以轉子類,因為它們都是指針,但若實際類型不符合則結果為空var o = new CNormclass();var t = o as IDisposable;var ot = new CTestX();var ot2 = new CTestChildX();WriteLine("as1: " + ((CTestChildX)ot));WriteLine("as1: " + (ot as CTestChildX));WriteLine("as3: " + (ot2 as CTestX));WriteLine("as4: " + ((CTestChildX)ot2));using (ot as IDisposable)//判斷如果它實現了該接口 {}}#endregion#region 多播委托delegate void MDX();static void TestMultiDelegate(){void func1(){WriteLine("func1");}void func2(){WriteLine("func2");}void func3(){WriteLine("func3");}MDX md = func1; //【!】第一步不能寫 +=,因為它還沒有初始值md += func3;md += func2;md(); //func1 func3 func2 執行順序與添加順序相同md -= func1;md(); //func3 func2//md -= (func2 + func3); //wrongmd = func1; //ok,事件不允許這樣 md();md -= func1; //編譯運行都OK,調用出錯md -= func2; //編譯運行都OK,調用出錯md();//調用異常 }#endregion#region UDP通信static void TestUDp(){var ipenda = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);var ipendb = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000);void StartUdpClientA(){UdpClient udp = new UdpClient(ipenda);//udp.Connect(ipendb);while (true){var recvBytes = udp.Receive(ref ipendb);var bytes = Encoding.ASCII.GetBytes("信息已收到[" + recvBytes.Length + "],請繼續發送");Thread.Sleep(1000);udp.Send(bytes, bytes.Length, ipendb);}}void StartUdpClientB(){UdpClient udp = new UdpClient(ipendb);//udp.Connect(ipend);while (true){WriteLine("請輸入發信息:");var str = ReadLine();var bytes = Encoding.ASCII.GetBytes(str);udp.Send(bytes, bytes.Length, ipenda);WriteLine("信息已發送等待回復:");var recvBytes = udp.Receive(ref ipenda);WriteLine(">>收到回復,字節數:" + recvBytes.Length);}}var t1 = new Thread(StartUdpClientA);var t2 = new Thread(StartUdpClientB);t1.Start();t2.Start();}#region TCP通信#endregion#endregion#region 可空類型void TestNullabletype(){//可空類型是一個泛型結構體Nullable<int> ix0 = null;//等同于下式int? ix = null; //可空類型object oa = 5;int iy = ix ?? 7; //7object ob = oa ?? 10; //5 WriteLine(iy);WriteLine(ob);}#endregion#endregion#region 2018.8.4#region 抽象類與接口對比interface ixinterface//不能加sealed {//1, 接口中不能寫public,因為默認為public,C#不會存在可有可無的東西//2,接口可以有抽象int this[int x] { set;get; } //3,接口中不可以寫實例化字段和屬性//4,可以有事件 }abstract class AbstractClass//不能加sealed {//int this[int x] { set; get; }int ix { set; get; }public abstract int iy { set; get; }void Func() { }int this[int x] {//可以定義索引器,但必須實現set { }}}class Dabclass : AbstractClass{public override int iy { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }}#endregion#endregion#region C#的析構函數不同于C++class myTemp<T>{public myTemp(){}/*private virtual */~myTemp(){//析構函數不能帶任何限制聲明,如public, protected, private, }}class Tehua : myTemp<string>{}#endregion #region 2018.8.14static void testIntLimit(){var le = -2147483648 < 2147483648;int ix = -2147483648;WriteLine(ix - 1); //0x80000000 + 0xffffffff = 0x7fffffff } #endregion#endregion// ctrl + w, t 可以察看所有待做任務static void Main(string[] args){//TestVarEquals();//TestUDp();//TestWaitHandle();//TestThreadAbort();//TestMultiDelegate();//TestVarEquals();//TestInitial();//TestInvoke();//Thread.Sleep(30000);//TestXiebianNibian();//TestAsyncWait();//TestTask();//TestThread();//TestRegexInStr();//TestCompareableobj();//TestExtMethod();//TestReflect();//TestDefaultStrEncoding();//TestDynamicAllocInCSharpCpp();//TestPartclass();//TestRefReturn();//TestOperatorOverload();// CTestChildX.TestDerive();//TestFloat();//var arr = returnArray(); }}#region 擴展方法sealed class ExtTargetCls{public float sum = 10;}//擴展方法必須在頂級靜態類中定義,不能是內部類//能不能通過擴展方法來修改類庫以達到不法目的? 不能,因為擴展方法只能修改類的公有成員static class ExtentMethod{public static void methodExt(this ExtTargetCls target, float add){target.sum += add;}}#endregion}

?

posted on 2018-08-14 11:25 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的2018.8.14-C#复习笔记总的全部內容,希望文章能夠幫你解決所遇到的問題。

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

天天天天天天干 | 亚洲综合色视频 | 日韩黄色在线观看 | 一本一本久久a久久精品综合小说 | 国产精品久久久久久久久搜平片 | 日韩高清不卡在线 | 91亚洲精品久久久中文字幕 | 亚洲全部视频 | 日本少妇高清做爰视频 | 日日爽天天操 | 成人 亚洲 欧美 | www.日日日.com | 国产亚洲免费的视频看 | 成人av av在线 | av噜噜噜在线播放 | 97精品视频在线 | 日本精品一区二区 | 午夜久久网站 | 91成人免费视频 | 美女久久 | 精品爱爱| 人人揉人人揉人人揉人人揉97 | 最新成人在线 | 91精品国自产拍天天拍 | 国产免码va在线观看免费 | 午夜精品久久久久久久久久久久 | 国产真实在线 | 中文字幕麻豆 | 91在线一区二区 | 福利一区二区在线 | 在线观看免费高清视频大全追剧 | 亚洲一级免费电影 | 美女免费黄视频网站 | 国产视频欧美视频 | 国产精品一区免费看8c0m | 天天艹天天干天天 | 精品久久网 | 亚洲精品国精品久久99热 | 欧美日韩精品区 | 91在线免费视频 | 亚洲精品自拍 | 中文字幕免费观看 | 亚洲欧美日韩在线一区二区 | 亚洲欧洲国产视频 | 狠狠躁日日躁狂躁夜夜躁 | 激情五月婷婷丁香 | 麻豆播放 | 日本久久久久久久久久 | 国产精品高清一区二区三区 | 欧美伦理电影一区二区 | 777视频在线观看 | 91丨九色丨蝌蚪丨老版 | 国产精品一区二区三区在线免费观看 | 成人av免费播放 | 国产一级免费av | 国产精品福利一区 | 日韩中文字幕国产精品 | 91在线91| 伊人影院99 | 日韩中文久久 | 久久女同性恋中文字幕 | 日韩理论电影在线 | 久草男人天堂 | 欧美一二三专区 | 黄色毛片在线 | 日本精品在线视频 | 黄色网免费 | 亚洲国产色一区 | 精品一区 精品二区 | 在线免费观看麻豆视频 | 亚洲黄色一级大片 | 亚洲国产经典视频 | 在线小视频国产 | 日韩免费电影网站 | 国产精品一区二区在线免费观看 | av中文字幕日韩 | wwwwww色| 国产精品久久久久久久久久久杏吧 | 国产亚洲精品久久 | 亚洲综合五月天 | 中文字幕乱码亚洲精品一区 | 国产精品福利在线 | 国产日韩欧美视频在线观看 | 日韩大片免费观看 | 丁香花在线观看免费完整版视频 | 精品黄色片 | 最近最新最好看中文视频 | 狠狠gao| 日韩毛片久久久 | 亚洲国产高清在线 | 免费av网站在线看 | 狠狠综合 | 不卡的av在线| 精品国产乱子伦一区二区 | 国产日韩av在线 | 色黄www小说 | 成人羞羞免费 | 国产精品午夜av | 偷拍福利视频一区二区三区 | 亚洲精品黄色在线观看 | 久久精品一二三区 | 亚洲午夜久久久影院 | 久久久精品在线观看 | 久久大视频| 亚洲国产中文字幕 | 成人在线观看av | 日韩在线首页 | 亚洲成年人免费网站 | 亚洲永久国产精品 | 久久久免费毛片 | 五月婷久久 | 人人爽人人爽人人片av | 波多野结衣最新 | 久久视精品 | 国产视频在线免费 | 91麻豆精品国产91久久久使用方法 | 成人免费网站在线观看 | 亚洲最新av网址 | 日韩精品久久一区二区 | 精品91视频 | 激情综合网在线观看 | 国产成人久久av免费高清密臂 | 香蕉视频在线观看免费 | 在线观看日韩专区 | 伊人久久国产精品 | 91精品国自产拍天天拍 | 免费在线激情电影 | 又长又大又黑又粗欧美 | 天天舔天天搞 | 久久激情五月丁香伊人 | 91精品视频免费 | 69av视频在线| 91丨九色丨蝌蚪丨老版 | 九九免费在线视频 | 日本精品视频一区二区 | 麻豆传媒视频在线 | 在线观看中文字幕2021 | 欧美精品三级在线观看 | 日日干干夜夜 | 成年美女黄网站色大片免费看 | 天无日天天操天天干 | 国产系列精品av | 久久国内精品视频 | 99久久精品国产免费看不卡 | 在线免费观看国产 | 亚洲综合色av | 俺要去色综合狠狠 | www蜜桃视频| 91精品对白一区国产伦 | 干 操 插 | 在线观看aa | 日韩高清精品免费观看 | 久久精品视频日本 | 日韩电影中文字幕在线 | 久久九九免费视频 | 狠狠狠色丁香婷婷综合激情 | 国产高清无线码2021 | 午夜在线观看一区 | 91高清一区 | 欧美日韩高清在线一区 | 精品国产乱码久久久久 | 人人爽人人片 | 欧美一区二视频在线免费观看 | 国产91精品一区二区麻豆网站 | 亚洲精品一区二区18漫画 | 色综合久久88色综合天天6 | 蜜臀av夜夜澡人人爽人人 | 久久不色 | 成年人视频免费在线播放 | 免费亚洲一区二区 | 青草视频在线看 | 久久人人精品 | 黄色视屏免费在线观看 | 久久视频在线观看免费 | 久久精品国产亚洲精品2020 | 精品日韩在线 | 中文字幕国语官网在线视频 | 国产精品久久精品 | 亚洲国产中文字幕在线观看 | www视频在线免费观看 | 奇米先锋 | av在线播放国产 | 色瓜 | 精品无人国产偷自产在线 | 国产福利在线 | 久久香蕉电影网 | 97色se| 亚洲性xxxx | 18久久久久久 | 日本在线视频网址 | 国产手机视频 | 国产精品videossex国产高清 | 丁香婷婷综合激情五月色 | 伊人五月天综合 | 国产精品免费久久久久久久久久中文 | www.亚洲精品视频 | 日韩欧美有码在线 | 中文字幕丝袜一区二区 | 国产一级一片免费播放放 | 久久99深爱久久99精品 | 91福利视频免费 | a黄色| 激情综合网五月婷婷 | 免费在线观看国产黄 | 亚洲精品啊啊啊 | 99精品视频免费观看 | 美女视频永久黄网站免费观看国产 | 成人黄色在线观看视频 | 中国老女人日b | 2019中文字幕网站 | 久久国产精品视频观看 | 午夜精品久久久久久99热明星 | 狠狠天天 | 午夜色性片 | 国产黄色片久久 | 成人中心免费视频 | 99国产在线视频 | 欧美日韩国产在线精品 | 久久伊人91| 99久久精品国产一区二区三区 | 国产午夜精品一区二区三区欧美 | 97视频免费 | 欧美成a人片在线观看久 | 国产一级片一区二区三区 | 精品一区在线看 | 欧美一级日韩三级 | www.天堂av| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产欧美综合视频 | 久久99精品视频 | 免费看色视频 | 国色天香在线 | 久久成人国产精品一区二区 | 久久av网址 | 狠狠网站 | 97超碰超碰 | 天天爱天天操天天干 | 久久成人资源 | 亚洲电影一级黄 | 国内揄拍国内精品 | 九九九九九九精品任你躁 | 国产精品久久在线观看 | 国产午夜三级 | 亚洲成人xxx| 久久九九久久精品 | 免费色视频网址 | 免费婷婷 | 久久久69| 日韩 在线a | 欧美日韩免费观看一区二区三区 | 国产在线色视频 | 激情五月婷婷激情 | 亚洲视频一级 | 97色婷婷人人爽人人 | 91国内在线 | 日本乱视频 | 三级黄免费看 | 国产亚洲小视频 | 国产日女人 | 六月久久婷婷 | 国产精品爽爽久久久久久蜜臀 | 国产免费美女 | 天天操伊人 | 69视频国产 | 99热这里精品 | 天天综合中文 | 午夜精品一区二区三区视频免费看 | 91成品视频 | 色视频网页| 亚洲一区二区三区四区在线视频 | 麻豆91精品 | 久久五月婷婷丁香社区 | 久久国产免费 | 久久国产精品一区二区三区四区 | 国产精品久99 | 成人黄色小说视频 | 在线观看日本高清mv视频 | 欧洲黄色片 | 色视频网站免费观看 | 日韩免费在线一区 | 免费国产黄线在线观看视频 | 亚洲免费精彩视频 | 亚洲高清久久久 | 日韩在线电影 | 亚洲精品视频在线免费播放 | 91在线视频免费91 | 伊人成人激情 | 99精品免费网 | 99久久影视| 久久激情综合 | 在线免费观看国产黄色 | 国产精品久久久久久一二三四五 | 久久99精品热在线观看 | 99热精品在线观看 | 国产一线天在线观看 | 青草视频在线免费 | 99国产精品| 最新日韩精品 | 亚洲成熟女人毛片在线 | 在线中文字幕播放 | 久久午夜电影 | 伊人亚洲精品 | 911亚洲精品第一 | 国产综合香蕉五月婷在线 | 国产一级做a爱片久久毛片a | 在线91观看| 日韩欧美一区二区在线播放 | 一区二区三区四区五区在线视频 | 欧美极品裸体 | 96久久久| 国内精品在线一区 | 日韩有码在线播放 | 欧美一级性生活片 | 亚洲精品小区久久久久久 | 91精品秘密在线观看 | 色在线亚洲| 激情欧美一区二区三区免费看 | 国产在线看一区 | 久久精品久久久久 | 午夜精品久久久99热福利 | 天天操天天射天天操 | 国产视频一区精品 | 色综合久久中文字幕综合网 | 99精品国产免费久久久久久下载 | 午夜精品久久久久久 | 国产精品com | 日韩二区三区在线 | 国色天香永久免费 | 久久久久欧美精品999 | 在线观看完整版 | 久久这里有精品 | 国产精品九九九九九九 | 中文字幕av免费在线观看 | 免费网址你懂的 | 亚州精品一二三区 | 国产黄色精品在线 | 欧美二区三区91 | 波多野结衣在线中文字幕 | 欧美韩国在线 | 日韩美女av在线 | 精品亚洲欧美一区 | 久草免费福利在线观看 | 成人四虎 | 欧美日韩国内在线 | 深爱婷婷 | 亚洲五月六月 | 久久五月情影视 | 久久成熟 | 婷婷网址 | 我要色综合天天 | 综合网av | 五月天久久久久久 | 国产亚洲精品久久久久久大师 | 亚洲综合在| 日韩在线精品一区 | 一 级 黄 色 片免费看的 | 欧美国产高清 | 精品欧美一区二区精品久久 | 国产色女 | 天天操操操操操操 | 久草在线资源网 | 午夜精品区| 免费看污在线观看 | 国产精品99视频 | 97香蕉久久国产在线观看 | 伊人影院99 | 黄色的网站在线 | 免费看毛片在线 | 久久视频在线看 | 超碰在线91 | 在线免费亚洲 | 天天摸天天操天天舔 | 97成人在线观看 | 国产91精品久久久久久 | 91秒拍国产福利一区 | 久久久三级视频 | 丁香色综合 | 久久手机精品视频 | 国产午夜精品一区二区三区四区 | 五月激情五月激情 | 美女国内精品自产拍在线播放 | 日韩精品久久久久久中文字幕8 | www在线免费观看 | av中文字幕剧情 | 91成年人在线观看 | 久久综合久色欧美综合狠狠 | 亚洲成年人在线播放 | 欧美一二区在线 | 国产蜜臀av | 久久久久久久久久久久影院 | 亚洲视频99| 在线免费观看一区二区三区 | 美女一级毛片视频 | 黄色片亚洲 | 91人人爽人人爽人人精88v | 在线不卡的av | 国产精品久久久久久久久久久久午夜片 | 欧美在线久久 | 在线中文视频 | 亚洲精品动漫成人3d无尽在线 | 国产黄a三级 | 国产亚洲久一区二区 | 国产精品一区二区62 | 国产精品资源在线观看 | 久久中文字幕导航 | 国产最新视频在线观看 | 亚洲区精品 | 2018亚洲男人天堂 | av在线播放中文字幕 | 久久综合狠狠综合久久激情 | 亚洲精品裸体 | 国产视频一区二区在线播放 | 久操免费视频 | www操操操| 国产超碰97 | 精品国自产在线观看 | 国产五月 | 国产亚洲综合性久久久影院 | 天堂网在线视频 | 人人爽人人澡人人添人人人人 | 精品久久久成人 | 波多野结衣久久资源 | 亚洲精品在线观看视频 | 亚洲国产影院av久久久久 | 在线观看精品国产 | 91九色视频 | 国产精品国产三级国产aⅴ9色 | 午夜久久久久久久久久久 | 男女拍拍免费视频 | 中文字幕在线观看免费高清电影 | 激情综合亚洲 | 国产亚洲综合在线 | 久久精彩视频 | 日本高清dvd | 国产日产亚洲精华av | 久久久国产精品一区二区中文 | 天天色天天骑天天射 | 蜜桃麻豆www久久囤产精品 | 日韩色一区二区三区 | 天天爽夜夜爽精品视频婷婷 | 亚洲影院天堂 | japanesexxxhd奶水| 91亚洲国产成人久久精品网站 | 免费99精品国产自在在线 | 91精彩在线视频 | 玖玖在线看 | 手机在线观看国产精品 | 国产在线视频一区二区三区 | 久久综合色天天久久综合图片 | 欧美一级久久久久 | 国产91亚洲精品 | 欧美一级电影片 | 国产亚洲精品久久久久久大师 | 伊人五月| 欧美一区二区三区不卡 | www操操操| 午夜精品久久久久久中宇69 | 国产91精品看黄网站在线观看动漫 | 日韩极品在线 | 久久dvd| 久久久久久久影院 | 一本一本久久a久久 | 最近日韩中文字幕中文 | 久久久久福利视频 | 狠色在线 | 国产精品久久久久久模特 | 天天视频亚洲 | 亚洲欧洲精品一区 | 在线观看91网站 | 精品久久影院 | 久草综合在线观看 | 欧美日韩在线观看一区二区三区 | 久久网址 | 91精彩视频在线观看 | 日韩av一区在线观看 | 日日干夜夜干 | 色综合久久五月天 | 精品久久久久久亚洲综合网站 | 激情伊人五月天 | 日本在线观看中文字幕 | 91视频com| 一本一道波多野毛片中文在线 | 国产一性一爱一乱一交 | 国产高清视频在线 | 国产精品美女999 | 亚洲精品资源在线 | 手机色站 | 成人免费看电影 | 中文一二区| 最近日本中文字幕 | 婷婷av网| 日韩网站在线 | 免费看亚洲毛片 | 欧美日韩中文字幕在线视频 | 色播五月激情五月 | 中文av不卡 | 亚洲精品99久久久久中文字幕 | 99久久精品国产一区 | 国产精品色婷婷 | 久久精品91久久久久久再现 | 久久伊人热 | 亚洲精品高清在线 | 日韩理论片在线 | 激情五月婷婷综合网 | 亚洲成人av电影 | 国产蜜臀av| av官网在线 | 免费高清无人区完整版 | 在线观看完整版免费 | 波多野结衣精品在线 | 色在线国产 | 中文字幕在线日本 | 在线国产一区二区三区 | 探花视频在线观看免费版 | 亚洲国产精品推荐 | 成人毛片在线视频 | 亚欧日韩av| 日韩高清国产精品 | 亚洲国产字幕 | 亚洲国产中文字幕在线观看 | 色射色 | 国产精品 中文字幕 亚洲 欧美 | 亚洲欧洲国产日韩精品 | 操操综合网| 国产精品久久久久久久久久尿 | 国产高清在线免费 | 国产一区二区在线精品 | 国产98色在线 | 日韩 | 九九色网 | 超碰国产在线播放 | 欧美另类视频 | 色资源网在线观看 | 国产精品久久久久久久久久久久久久 | 91在线观看视频 | 久久久久久久久久久久久久电影 | 婷婷综合在线 | 久久久精品午夜 | 又黄又爽又无遮挡的视频 | 日本久久片 | 国产 日韩 在线 亚洲 字幕 中文 | 操天天操 | 福利一区视频 | 色婷婷激情网 | 中文字幕 国产 一区 | 国产品久精国精产拍 | 91久草视频| 热久久精品在线 | 国产精品电影在线 | 天天色天天上天天操 | 人人舔人人爽 | 在线观看岛国 | 欧美一级免费片 | 亚一亚二国产专区 | 最近最新中文字幕视频 | 天天干天天草天天爽 | 天天操天天摸天天干 | 中文字幕一区二区三区四区 | 在线电影 一区 | 综合天天 | av在线精品| 国产午夜精品福利视频 | 四虎国产精品免费观看视频优播 | 成人精品久久久 | 高清在线一区 | 日韩色爱 | 黄色aaa级片 | 成人一区二区三区在线观看 | 91丨九色丨高潮丰满 | 久久久久久久国产精品视频 | 日韩久久精品一区二区 | 久综合网 | 最新国产精品视频 | 九九免费在线看完整版 | 视频在线观看亚洲 | 99在线免费观看视频 | av手机在线播放 | 中文字幕第 | 亚洲精品九九 | 超碰av在线播放 | 日本在线免费看 | 国产精品高清一区二区三区 | 在线看一区二区 | av免费福利| 国产在线精品二区 | 超碰人人做 | 久久99免费观看 | 欧美另类性 | 日韩欧美大片免费观看 | 五月的婷婷 | 一级α片 | 波多野结衣最新 | 日韩av二区| 久久色在线播放 | 欧美成人精品欧美一级乱 | av免费在线观 | 香蕉一区| 国产一级在线视频 | 激情欧美日韩一区二区 | www色片 | 国产成人精品网站 | 一区二区影院 | 米奇四色影视 | 亚洲国产日韩av | 91精品视频网站 | 久久乐九色婷婷综合色狠狠182 | 三级动态视频在线观看 | ww视频在线观看 | 91免费观看网站 | 精品国产综合区久久久久久 | 在线蜜桃视频 | 日韩精品视频第一页 | 国产精品久久视频 | 色婷婷88av视频一二三区 | 91久久久久久久 | 久久精品国产一区二区电影 | 国产高清免费观看 | www.在线看片.com | 精品国产乱码 | 天天做天天爱天天综合网 | 国产96在线 | 久草视频中文 | 久久96国产精品久久99漫画 | 青青河边草免费观看完整版高清 | 欧美激情精品久久久久久免费印度 | 精品久久久久久久久久久久久 | 99产精品成人啪免费网站 | 久草免费福利在线观看 | 网站在线观看你们懂的 | 狠狠色丁香久久婷婷综 | 99精品视频网站 | 日韩精选在线 | 久久免费视频网站 | 欧美日韩亚洲在线观看 | 成人一级视频在线观看 | 99re热精品视频 | 国产精品11 | 久久精品99精品国产香蕉 | 在线99热 | 久久免费的视频 | 成人久久免费视频 | 欧美一级电影免费观看 | 在线视频亚洲 | 91视频下载 | 午夜精品在线看 | 伊人永久 | 免费在线激情电影 | 色999精品| 成人av资源在线 | 欧美一级片免费播放 | 国产韩国精品一区二区三区 | 国产精品久久久影视 | 一级黄色av | 免费看在线看www777 | 日韩成人黄色 | 色噜噜噜 | 日韩在线观看视频网站 | 精品一区 精品二区 | 色天天中文 | 国产精品美女久久久久久久久 | 中文字幕免费 | 国产剧情一区二区在线观看 | 国产精品国产三级国产aⅴ9色 | 国产亚洲人成网站在线观看 | 国产一区视频在线观看免费 | www在线观看视频 | 99视频在线 | 天天插天天狠 | 深爱婷婷久久综合 | av黄在线播放 | 在线观看色网 | 成人午夜片av在线看 | 日韩av电影中文字幕在线观看 | 午夜影视av | 黄色小说免费在线观看 | 免费精品久久久 | 在线观看视频你懂 | 成人久久精品视频 | 婷婷国产视频 | 成人av直播| 精品国产乱码久久久久久1区二区 | 在线观看久久久久久 | 久久手机免费观看 | 日日夜夜人人精品 | 国产精品毛片一区视频播不卡 | 四虎影视成人精品国库在线观看 | av免费观看网址 | 深夜国产福利 | 成年美女黄网站色大片免费看 | 国产精品欧美久久久久天天影视 | 五月综合网| 国产免费一区二区三区最新6 | 一级片在线 | 综合在线色 | 四虎视频| 欧美一区二区三区免费观看 | 蜜桃视频在线观看一区 | 在线免费观看麻豆视频 | 国产又粗又猛又爽又黄的视频免费 | 亚洲免费不卡 | 麻豆国产网站入口 | 国产精品a久久久久 | 亚洲欧美日韩中文在线 | 天天干,天天插 | 久草| 果冻av在线 | 在线观看资源 | 97狠狠操 | 国产一区二区三区免费在线观看 | 99精品视频免费看 | 天天操天天操一操 | 激情深爱.com | 麻豆91精品视频 | 免费在线日韩 | 久久久久久久久久久久久9999 | 99久久精品国产系列 | 国产精品一区二区无线 | 91伊人影院 | 午夜私人影院 | 成人18视频| 黄色av一区二区 | 天天天干天天射天天天操 | 一区国产精品 | av丝袜制服 | 在线国产不卡 | 在线 精品 国产 | av成人免费在线看 | 黄色免费看片网站 | 亚洲精品国产精品国自产观看 | 国产欧美精品一区二区三区四区 | 成人av一区二区在线观看 | 中文字幕精品www乱入免费视频 | 婷婷av在线 | 久草香蕉在线视频 | 啪啪午夜免费 | 国模视频一区二区 | 国产亚洲精品电影 | 国产黄免费在线观看 | 国产精品美女久久久免费 | 日韩激情小视频 | 色婷婷www | av在线最新 | 亚洲女欲精品久久久久久久18 | 96久久久| 久久久精品影视 | 欧美日韩精品在线免费观看 | 午夜免费久久看 | 尤物97国产精品久久精品国产 | 婷婷丁香社区 | 在线播放 日韩专区 | 国产欧美久久久精品影院 | 中文字幕影片免费在线观看 | 久久黄色网 | 超级碰碰视频 | 久久伊人色综合 | 中文字幕在线观看你懂的 | 日韩精品一区二区在线观看视频 | 国产一二三区av | 久久精品亚洲综合专区 | 麻豆传媒视频在线免费观看 | 国内小视频 | 国产精品网在线观看 | 午夜视频免费播放 | 亚洲精品观看 | 97精品伊人 | 麻花天美星空视频 | 99久久精品国 | 精品久久一区二区三区 | 亚洲精品乱码久久久久久9色 | 日日射av| 91香蕉视频色版 | 中文字幕第一页在线vr | 综合国产视频 | 91亚洲免费| 午夜精品一区二区三区视频免费看 | 91男人影院 | 日韩伦理一区二区三区av在线 | 丰满少妇对白在线偷拍 | 欧美在线free | 国产精品久久久久久久久大全 | 日韩三级在线观看 | 免费精品久久久 | 久久色中文字幕 | 亚洲精品欧美视频 | 五月综合色婷婷 | 超碰官网| 三级av中文字幕 | 久久综合成人 | 精品美女在线观看 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 精品亚洲va在线va天堂资源站 | 日韩mv欧美mv国产精品 | 国产精品av免费在线观看 | 亚洲视频网站在线观看 | 2018好看的中文在线观看 | 国产精品一区二区av影院萌芽 | 日韩av一区二区三区在线观看 | 欧美天天综合网 | 婷婷六月天丁香 | 久久99国产一区二区三区 | 在线观看你懂的网站 | 亚洲黄色小说网 | 久久久免费在线观看 | 国产一级免费视频 | 亚洲国产中文字幕在线 | 国产高清精品在线观看 | 色婷婷成人网 | 夜夜躁狠狠躁日日躁视频黑人 | 日一日干一干 | 最近日本韩国中文字幕 | 中文字幕av电影下载 | 日日操网站 | 国产一及片 | 一级欧美日韩 | 91成人免费视频 | 国产一区二区在线影院 | www黄色av| 久久久久一区二区三区 | 天天干天天玩天天操 | 亚洲va天堂va欧美ⅴa在线 | 91麻豆精品国产自产在线 | 亚洲成人黄| 亚洲精品97 | 久久久久国产精品免费免费搜索 | 亚洲精品动漫成人3d无尽在线 | 青春草视频 | 国产精品久久久久久久免费 | 99久久久国产精品免费99 | 福利视频在线看 | 亚洲狠狠操| 色老板在线 | 日本中文在线观看 | 免费高清在线视频一区· | 成人国产综合 | 欧美日韩久久 | 国产999精品久久久 免费a网站 | 黄色特级毛片 | 男女全黄一级一级高潮免费看 | 91麻豆精品国产91久久久无限制版 | 日韩深夜在线观看 | 9在线观看免费高清完整版在线观看明 | 亚洲开心激情 | 久久久国产日韩 | 奇米网网址 | 玖玖精品视频 | 国产精品久久久久久久久久白浆 | 亚洲国产高清在线观看视频 | 久久成人午夜视频 | 中文字幕在线观看视频免费 | 国产精品不卡在线播放 | 一级黄视频 | 97人人爽人人 | 久久精品韩国 | 久99精品 | 91精品国产91久久久久 | 久久精品久久久久久久 | 免费在线观看成人av | 久久草视频 | 国产99久久久精品视频 | 婷婷精品 | 成 人 黄 色 视频免费播放 | 日韩毛片在线免费观看 | 成人中文字幕在线 | 色诱亚洲精品久久久久久 | 亚洲最新视频在线播放 | 国产精品久久久久aaaa | 久保带人 | 国产日韩精品一区二区三区在线 | 最近中文字幕国语免费高清6 | 久久老司机精品视频 | 久久综合九色综合欧美狠狠 | 久久精品综合一区 | 欧美成人精品三级在线观看播放 | 亚洲午夜精品久久久久久久久 | 精品久久一区二区 | 99精品免费 | 韩国av一区 | 国产在线精品国自产拍影院 | 在线观看久久 | 国产第页 | 黄色小说视频在线 | 国产亚洲欧美精品久久久久久 | 成人在线视频免费观看 | 日韩高清在线一区二区 | 国产无套一区二区三区久久 | av成人免费在线观看 | 国产精品一级在线 | 亚洲精品视频网站在线观看 | 欧美性色网站 | 丰满少妇一级片 | 国产精品综合av一区二区国产馆 | 精品一区二区影视 | 少妇bbr搡bbb搡bbb | 亚洲另类视频在线 | 懂色av一区二区三区蜜臀 | 黄色大全免费观看 | 日韩高清无线码2023 | 日韩三级视频在线观看 | 操天天操 | 在线看片中文字幕 | 欧美日韩久久一区 | 97福利社| 97精品国产97久久久久久免费 | 成人久久久久久久久久 | 激情综合五月天 | 一本色道久久精品 | 爱爱av网站 | 网站免费黄色 | 草久久久久 | 久久精品99久久久久久 | 91精品久 | 国产91对白在线播 | 天天摸天天舔天天操 | 成人a级黄色片 | 激情五月婷婷激情 | 色久av | 中文字幕日本在线观看 | 亚洲综合网站在线观看 | 丝袜+亚洲+另类+欧美+变态 | 亚洲专区中文字幕 | 欧美日韩精品二区第二页 | 精品久久网 | 国产视频一区二区在线播放 | 免费看片亚洲 | 蜜臀av网址 | 久艹在线观看视频 | 伊人五月婷| 日韩av成人免费看 | 国产一区视频在线观看免费 | 久久久九色精品国产一区二区三区 | 91污在线观看 | 综合久久综合久久 | 精品二区久久 | 夜夜天天干| 国产精品青青 | 96视频在线| 精品资源在线 | 精品国产一区二区三区四区vr | 欧美一区二区伦理片 | 国产精品手机看片 | av超碰在线 | 成人一区在线观看 | 亚洲国产日韩欧美在线 | 手机在线视频福利 | 亚洲精品久久久久久中文传媒 | 日韩免费在线观看 | 99久久日韩精品视频免费在线观看 | 日韩综合视频在线观看 | 91精品久久久久久 | 久久成人国产精品免费软件 | x99av成人免费 | av中文字幕在线看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 97精品国产91久久久久久久 | 日韩精品久久久久久中文字幕8 | 日韩羞羞| 久久久这里有精品 | 丁香视频在线观看 | 国产乱视频| 麻豆视频在线观看 | 亚洲国产婷婷 | 久久久久久久久久福利 | 天天色天天上天天操 | 一区三区视频在线观看 | 日韩免费看的电影 | 国产一二三在线视频 | 亚洲老妇xxxxxx | 91看片在线 | 日b视频国产 | 亚洲高清视频在线 | 日韩欧美在线综合网 | 久久五月情影视 | aaa亚洲精品一二三区 | 成人资源在线观看 | 日韩中文字幕视频在线观看 | www.色综合.com | 久久九九久久精品 | 一二区电影 | 久久精品成人欧美大片古装 | 99国产视频在线 | 国产精品久久久久久久免费 | 亚洲欧美精品一区 | 国产网站av | 色婷婷色 | 婷婷激情综合 | 日韩黄色一区 | 亚洲精品视频在线看 | 伊人影院在线观看 | 久久久久久片 | 国产精品久久久久久久久久白浆 | 日韩av在线免费看 | 色在线视频网 | 久久精品一二区 | 亚洲高清91 | 亚洲精品女 | 国产中文视 | 69国产精品视频免费观看 | 午夜成人免费影院 | 狠狠色伊人亚洲综合网站色 |