委托学习要点:
1.为什么要使用委托
将一个方法作为参数传递给另一个方法.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 为什么使用委托 { public delegate void DelProStr(string [] names); public delegate string DelProStr2(string name); class Program { static void Main(string[] args) { //三个需求 //1.将一个字符串数组中每个元素都转换成大写 //2.将一个字符串数组中每个元素都转换成小写 //3.将一个字符串数组中每个元素两边都加上 双引号 string[] names = { "abCDefG", "HIJKlmnOP", "QRsTuW", "XyZ" }; //Test(names, ProStrToUpper); //ProStr(names, ToSYH); //匿名函数 ProStr(names, delegate(string name) { return name.ToLower(); }); for (int i = 0; i < names.Length; i++) { Console.WriteLine(names[i]); } Console.ReadKey(); } #region public static void ProStr(string [] names,DelProStr2 del2) { for(int i=0;i<names.Length;i++) { names[i] = del2(names[i]); } } public static string ToUpper(string name) { return name.ToUpper(); } public static string Tolower(string name) { return name.ToLower(); } public static string ToSYH(string name) { return """+name+"""; } #endregion public static void Test(string [] names,DelProStr del) { del(names); } //大写 public static void ProStrToUpper(string[] names) { for (int i = 0; i < names.Length; i++) { names[i] = names[i].ToUpper(); } } //小写 public static void ProStrToLower(string [] names) { for(int i=0;i<names.Length;i++) { names[i] = names[i].ToLower(); } } //双引号 public static void ProStrSYH(string [] names) { for(int i=0;i<names.Length;i++) { names[i] = """ + names[i] + """; } } } }
2.委托的概念
声明一个委托类型
委托所指向的函数必须跟委托具有相同的签名(参数和返回值)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _08委托概念 { //声明一个委托指向一个函数 public delegate void DelSayHi(string name); class Program { static void Main(string[] args) { //DelSayHi del = new DelSayHi(SayChinese); DelSayHi del = SayChinese; //Test("张三",); Test("张三", SayChinese); Test("alexx", SayEnglish); Console.ReadKey(); } public static void Test(string name,DelSayHi del) { //调用 del(name); } public static void SayChinese(string name) { Console.WriteLine("吃了么?"+name); } public static void SayEnglish(string name) { Console.WriteLine("Nice to meet you"+name); } } }
3.匿名函数
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _09匿名函数 { public delegate void DelSay(string name); class Program { static void Main(string[] args) { //匿名函数 DelSay del = delegate(string name) { Console.WriteLine("Hello"+name); }; del("alexx"); //lamda表达式 => goes to DelSay del = (string name) => { Console.WriteLine("HI "+name); }; del("alexx"); Console.ReadKey(); } //public static void } }
4.练习:使用委托求数组的最大值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _10求数组的最大值 { public delegate int DelCompare(object o1,object o2); class Program { static void Main(string[] args) { object [] o ={"1","2","3","4","56"}; //DelCompare del = Compare; //object resule = GetMax(o, Compare2); object result = GetMax(o, delegate(object o1, object o2) { string s1 = (string)o1; string s2 = (string)o2; return s1.Length - s2.Length; }); Console.WriteLine(result); Console.ReadKey(); } public static object GetMax(object [] nums,DelCompare del) { object max = nums[0]; for(int i=0;i<nums.Length;i++) { if(del(max,nums[i]) < 0) { max =nums[i]; } } return max; } public static int Compare(object o1,object o2) { int n1 = (int)o1; int n2 = (int)o2; return n1 - n2; } public static int Compare2(object o1,object o2) { string s1 = (string)o1; string s2 = (string)o2; return s1.Length - s2.Length; } //int数组 public static int GetMax(int [] nums) { int max = nums[0]; for(int i=0;i<nums.Length;i++) { if (max < nums[i]) max = nums[i]; } return max; } //string数组 public static string GetMax(string [] names) { string max = names[0]; for(int i=0;i<names.Length;i++) { if (max.Length < names[i].Length) max = names[i]; } return max; } } }
5.练习:使用委托求任意数组的最大值 =>泛型委托
6.泛型委托
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _11泛型委托 { public delegate int DelCompare<T>(T o1, T o2); class Program { static void Main(string[] args) { int [] nums = {1,2,3,4,5,123 }; int max = GetMax<int>(nums, delegate(int o1, int o2) { return o1 - o2; }); Console.WriteLine(max); Console.ReadKey(); } public static T GetMax<T>(T[] nums, DelCompare<T> del) { T max = nums[0]; for (int i = 0; i < nums.Length; i++) { if (del(max, nums[i]) < 0) { max = nums[i]; } } return max; } } }
7.多播委托
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多播委托 { public delegate void DelTest(string str); class Program { static void Main(string[] args) { // DelTest del = t1; del += t2; del += t3; del("aa"); Console.WriteLine(del); Console.ReadLine(); } private static void t1(string name) { Console.WriteLine("t1"+name); } private static void t2(string name) { Console.WriteLine("t2"+name); } private static void t3(string name) { Console.WriteLine("t3"+name); } } }
8.lamda表达式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _12lamda表达式 { public delegate void Delone(); public delegate void Deltwo(string name); public delegate string Delthree(string name); class Program { static void Main(string[] args) { Delone one = delegate() { }; Delone two = () => { }; Deltwo a = delegate(string name) { }; Deltwo b = (string name) => { }; Delthree ac = delegate(string name) { return name; }; Delthree ab =(string name)=>{return name;}; List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; list.RemoveAll(n => n >= 8);//lamda表达式 foreach(var item in list) { Console.WriteLine(item); } Console.ReadKey(); } } }
9.使用委托来实现窗体传值.
(父窗体与子窗体来回传值)
FORM1:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.dellaber = laberShow; frm2.Show(); //this.Hide(); } private void laberShow(string str) { this.label1.Text = str; } private void button2_Click(object sender, EventArgs e) { Form2 frm2 = new Form2(); frm2.Textbox1 = this.label1.Text + "ZQ!"; frm2.Show(); } } }
FORM2:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public delegate void DelShowForm1Laber(string str); public partial class Form2 : Form { public DelShowForm1Laber dellaber; public Form2() { InitializeComponent(); } private string _textbox1; public string Textbox1 { get { return _textbox1; } set { _textbox1 = value; this.label1.Text = _textbox1; } } private void button1_Click(object sender, EventArgs e) { this.textBox1.Text = this.textBox1.Text.Trim(); //fuzhi //Form1 frm1 = new Form1(); //frm1.Show(); dellaber(this.textBox1.Text); this.Hide(); } private void form2_laber(string str) { this.label1.Text = str; } } }