C# 匿名/委託/擴充套件方法/lambda表示式
阿新 • • 發佈:2022-05-30
匿名/委託/擴充套件方法/lambda表示式
推斷型別Var關鍵字的使用
概念
var可以根據變數的初始值自動推斷區域性變數型別
注意問題:
- var只能定義區域性變數,而不能定義成員變數
- 定義的時候必須同時完成初始化,而不能使用var定義變數為null
- var本身不是一個新型別,只是用來修飾一個可以推斷出具體型別的區域性變數
var定義變數與object型別定義的區別
推斷型別var總結
使用var應該注意的問題
匿名類
什麼是匿名類
匿名類的特點
- 直接使用new關鍵字建立物件,使用var定義物件變數
- 而不需要提前編寫類的成員,並且只能新增物件的屬性
分析匿名類的本質
簡單擴充套件方法的應用
體驗擴充套件方法的使用
擴充套件方法定義
不帶引數的擴充套件方法定義
static 方法名(this 目標型別 目標型別引數)
帶引數的擴充套件方法定義
static 方法名(this 目標型別 目標型別引數,引數型別1,引數名2,…)
擴充套件方法使用中應該注意的問題
- 擴充套件方法必須定義在靜態類中,擴充套件方法本身也是靜態方法
- 如果擴充套件方法和對應的類位於不同的名稱空間,使用時應引入擴充套件方法所在靜態類的名稱空間
- 當類本身的方法與擴充套件方法重名時,類本身的方法被優先呼叫
- 擴充套件方法不要過多使用
定義帶引數的擴充套件方法
繼承的侷限性
開發中遇到的問題
- 公司購買了一個第三方編寫的模組用於專案研發,該模組被封裝在了DLL中,現在需要對第三方模組中某一個類增加一個方法,怎麼辦?
解決辦法:使用繼承
使用擴充套件方法解決上面的問題
結論:使用擴充套件方法讓系統的擴充套件更靈活,更方便!
委託
委託像是—種呼叫,委託像是—種引用指標
委託的使用
瞭解委託(delegate)
- 委託是一種新的面嚮物件語言特性,執行與.NET平臺之上
- 基於委託,開發事件驅動的應用程式非常簡單
- 使用委託可以大大簡化多執行緒程式設計的難度
理解委託
- 委託,也可以看成是一種資料型別,可以用於定義變數,但他是一種特殊的變數
- 委託定義的變數能接收的數值只能是一個方法(函式),可以理解成委託就是一個方法(方法)的指標
委託使用的基本步驟
匿名方法與lambda表示式
匿名方法
匿名方法的概念和使用
匿名方法允許將程式碼塊(方法體部分)通過委託變數作為引數傳遞,以代替單獨定義的方法
Lambda表示式
C#3.0引入了Lambda表示式,利用它們可以更簡練地編寫程式碼塊
()=>{}
有什麼=>做什麼
Lambda表示式定義規範與使用說明
- 引數列表中的引數型別可以是“明確”型別或者是“推斷”型別
- 如果是推斷型別,則引數的資料型別將由編譯器根據上下文自動推斷出來
關於Lambda表示式中的符號
- Lambda運算子=>,該運算子讀為“goes to”。
- 該Lambda運算子的左邊是輸入引數(如果有),右邊包含表示式或語句塊。Lambda表示式x=>x*x 讀作“x goes to x times x"
Lambda與匿名方法比較
- Lambda表示式本身就是匿名方法
- Lambda表示式的引數允許不指明引數型別,而匿名方法的引數必須明確指明引數型別
- Lambda表示式方法體允許由單一表達式或者多條語句組成,而匿名方法不允許單一表達式形式
示例
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace LinqDemo 6 { 7 class Program 8 { 9 //示例1:使用var推斷型別 10 static void Main(string[] args) 11 { 12 var a = 20; 13 var bookName = ".NET開發"; 14 var objStudent = new Student() { StudentName = "小張", Age = 22 }; 15 Console.WriteLine("共有{0} 個人在學習{1} 系列課程,其中{2} ,{3}歲,已經是高手了。", 16 a, bookName, objStudent.StudentName, objStudent.Age); 17 Console.ReadLine(); 18 } 19 //示例2:普通變數定義方法與var定義的比較 20 //static void Main(string[] args) 21 //{ 22 // int a = 20; 23 // string bookName = ".NET開發"; 24 // Student objStu = new Student() { StudentName = "小張", Age = 22 }; 25 // Console.WriteLine("共有{0} 個人在學習{1} 系列課程,其中{2} ,{3}歲,已經是高手了。", 26 // a, bookName, objStu.StudentName, objStu.Age); 27 // Console.ReadLine(); 28 //} 29 // 示例3:var與object的區別 30 //static void Main(string[] args) 31 //{ 32 // object b = 20; 33 // b = ".NET開發"; 34 // var a = 20; 35 // a = ".NET開發"; 36 // Console.ReadLine(); 37 //} 38 //示例4:匿名類的使用 39 //static void Main(string[] args) 40 //{ 41 // var objPerson = new 42 // { 43 // Name = "小王", 44 // Age = 25, 45 // ClassName = "軟體1班" 46 // }; 47 // Console.WriteLine("姓名:{0} 年齡:{1} 班級:{2}", 48 // objPerson.Name, objPerson.Age, objPerson.ClassName); 49 // Console.ReadLine(); 50 //} 51 //var使用應注意的問題 52 //static void Main(string[] args) 53 //{ 54 // var a=2008; 55 // var b =new int[] { 1, 2, 3 }; 56 // var e = "北京"; 57 // Console.WriteLine("a={0} e={1}", a, e); 58 // Console.ReadLine(); 59 //} 60 //static void Main(string[] args) 61 //{ 62 // Console.Write("請輸入您的姓名:"); 63 // string stuName = Console.ReadLine(); 64 // Console.WriteLine(); 65 // Console.Write("請輸入您的5門課程總成績:"); 66 // int sum = int.Parse(Console.ReadLine()); 67 // Console.WriteLine(); 68 // Console.WriteLine("{0}{1}", stuName.StuInfo(), sum.GetAvg()); 69 // Console.ReadLine(); 70 //} 71 //示例7:定義和使用帶引數的擴充套件方法 72 //static void Main(string[] args) 73 //{ 74 // Student objStudent = new Student() { StuName = "張曉麗" }; 75 // string info = objStudent.ShowStuInfo(67, 89); 76 // Console.WriteLine(info); 77 // Console.ReadLine(); 78 //} 79 //static void Main(string[] args) 80 //{ 81 // int a; //定義變數 82 // a = 100; //給變數賦值 83 // int b = a + 10; //使用變數 84 //} 85 //示例8:委託的定義與使用 86 //static void Main(string[] args) 87 //{ 88 // //【3】建立委託物件,關聯“具體方法” 89 // CalculatorDelegate objCal = new CalculatorDelegate(Add); 90 // //【4】通過委託去呼叫方法,而不是直接使用方法 91 // int result = objCal(10, 20); 92 // Console.WriteLine("10+20={0}", result); 93 // //【5】根據需要,變換委託的指向 94 // objCal -= Add; //斷開當前委託物件所關聯的方法(加法) 95 // objCal += Sub; //重新指向一個新的方法(減法) 96 // result = objCal(10, 20); //重新使用委託物件,完成減法功能 97 // Console.WriteLine("10-20={0}", result); 98 // Console.ReadLine(); 99 //} 100 ////【2】根據委託定義一個“具體方法”實現加法功能 101 //static int Add(int a, int b) 102 //{ 103 // return a + b; 104 //} 105 ////【2】根據委託定義一個“具體方法”實現減法功能 106 //static int Sub(int a, int b) 107 //{ 108 // return a - b; 109 //} 110 //示例9:匿名方法的使用 111 //static void Main(string[] args) 112 //{ 113 // //委託變數接收一個匿名方法 114 // CalculatorDelegate objCal = delegate(int a, int b) 115 // { 116 // return a + b; 117 // }; 118 // int result = objCal(10, 20); 119 // Console.WriteLine("10+20={0}", result); 120 // Console.ReadLine(); 121 //} 122 ////示例11:Lambda表示式的定義與使用 123 //static void Main(string[] args) 124 //{ 125 // //委託變數接收一個Lambda表示式 126 // CalculatorDelegate objCal = (int a, int b) => { return a + b; }; 127 // int result = objCal(10, 20); 128 // Console.WriteLine("10+20={0}", result); 129 // Console.ReadLine(); 130 //} 131 //示例12:Lambda表示式的更多應用方法 132 //static void Main(string[] args) 133 //{ 134 // MathDelegate objMath = a => a * a; 135 // int result = objMath(10); 136 // Console.WriteLine("a的平方={0}", result); 137 // Console.ReadLine(); 138 //} 139 } 140 public delegate int MathDelegate(int a); 141 //【1】宣告委託(定義一個函式的原型:返回值 + 引數型別和個數) 142 public delegate int CalculatorDelegate(int a, int b); 143 }View Code
END