委托泛型委托多播委托 和 lamda表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托泛型委托多播委托 和 lamda表达式相关的知识,希望对你有一定的参考价值。
委托基本概念:可以把一个方法作为一个参数传给另一个方法
声明: 方法前加 delegate 关键字
列子:
using System; using System.Collections; using System.Collections.Generic; namespace Dome { class dom { static void Main(string[] args) { string[] sname = { "Abc", "dFg", "HjK" }; toUpper(sname); for (int i = 0; i < sname.Length;i++ ) { Console.WriteLine(sname[i]); } Console.ReadKey(); } //现在有三个需求 //将字符串数组中的每个元素转换成大写; //将字符串数组中的每个元素转换成小写; //将字符串数组中的每个元素都添加上一个双引号; public static void toUpper(string[] names) { for (int i = 0; i <names.Length ;i++ ) { names[i] = names[i].ToUpper(); } } //xiaoxie public static void toxiao(string[] names) { for (int i = 0; i < names.Length;i++ ) { names[i] = names[i].ToLower(); } } //添加双引号 public static void toshuang(string[] names) { for (int i = 0; i < names.Length; i++) { names[i] = "\""+names[i]+"\""; } } } }
解析:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs { public delegate void delsayhi(string name);//放在类外面 class t { static void Main(string[] args) { //声明一个委托,必须要跟传递的方法具有相同的 签名(返回值和参数) //创建委托对象 //函数可以赋值给一个委托 delsayhi del = wsayhi; //new delsayhi(wsayhi); del("张三"); test("张张",sayhi); //匿名函数 没有名字的函数 test("李四", delegate(string name) { Console.WriteLine("hello"+name); }); //lamda表达式 => goes to test("王五", (string name) => { Console.WriteLine("hello" + name); }); Console.ReadKey(); } public static void test(string name, delsayhi del) { del(name); } public static void sayhi(string name) { Console.WriteLine("你好" + name); } public static void wsayhi(string name) { Console.WriteLine("hello" + name); } } }
使用委托简化:
using System; using System.Collections; using System.Collections.Generic; namespace Dome { public delegate string delpro(string str); class dom { static void Main(string[] args) { string[] sname = { "Abc", "dFg", "HjK" }; //toUpper(sname); test(sname, p3); for (int i = 0; i < sname.Length;i++ ) { Console.WriteLine(sname[i]); } Console.ReadKey(); } public static void test(string[] names,delpro del) { for (int i = 0; i < names.Length;i++ ) { names[i] = del(names[i]); } } public static string p1(string str) { return str.ToUpper(); } public static string p2(string str) { return str.ToLower(); } public static string p3(string str) { return "\""+str+"\""; } //现在有三个需求 //将字符串数组中的每个元素转换成大写; //将字符串数组中的每个元素转换成小写; //将字符串数组中的每个元素都添加上一个双引号; //public static void toUpper(string[] names) { // for (int i = 0; i <names.Length ;i++ ) // { // names[i] = names[i].ToUpper(); // } //} ////xiaoxie //public static void toxiao(string[] names) { // for (int i = 0; i < names.Length;i++ ) { // names[i] = names[i].ToLower(); // } //} ////添加双引号 //public static void toshuang(string[] names) { // for (int i = 0; i < names.Length; i++) // { // names[i] = "\""+names[i]+"\""; // } //} } }
使用匿名函数再简化:
using System; using System.Collections; using System.Collections.Generic; namespace Dome { public delegate string delpro(string str); class dom { static void Main(string[] args) { string[] sname = { "Abc", "dFg", "HjK" }; //toUpper(sname); // test(sname, p3); //使用匿名函数简化; test(sname, delegate(string name) { return name.ToUpper(); }); //lamda表达式 test(sname, (string str) => { return str.ToLower(); }); for (int i = 0; i < sname.Length;i++ ) { Console.WriteLine(sname[i]); } Console.ReadKey(); } public static void test(string[] names,delpro del) { for (int i = 0; i < names.Length;i++ ) { names[i] = del(names[i]); } } //public static string p1(string str) { // return str.ToUpper(); //} //public static string p2(string str) { // return str.ToLower(); //} //public static string p3(string str) { //return "\""+str+"\""; //} } }
以上是关于委托泛型委托多播委托 和 lamda表达式的主要内容,如果未能解决你的问题,请参考以下文章
(23)c#传智:单例模式,XML读写,委托,匿名函数,Lamda,多播委托