1. 程式人生 > 其它 >C# 匿名/委託/擴充套件方法/lambda表示式

C# 匿名/委託/擴充套件方法/lambda表示式

匿名/委託/擴充套件方法/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