在 2.0 之前的 C# 版本中,声明托付的唯一要领是运用定名要领。C# 2.0 引入了匿名要领(托付),而在 C# 3.0 及更高版本中,Lambda 表达式庖代了匿名要领,作为编写内联代码的首选体式格局。
匿名托付(要领):
匿名托付的叫法并不正确,正确的应当叫做匿名要领,(总之二者是一个意义啦)。前面 托付范例 中我已提到过,托付是用于援用与其具有雷同标签的要领。换句话说,您可以运用托付对象挪用可由托付援用的要领(参数是要领名)。而匿名要领则是将代码块作为托付参数(参数是完成功用的代码)经由过程运用匿名要领,因为您没必要建立零丁的要领,因而减少了实例化托付所需的编码体系开支。
编辑匿名要领:
匿名要领是直接挂载在托付内的代码块,照样得经由过程运用 delegate 关键字建立托付实例来声明。
delegate void MyDelegate(int i); //声明一个托付
MyDelegate my = delegate(int i){ /* 代码块*/ }; //经由过程建立一个托付实例来完成一个匿名要领
匿名要领实例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { //声明一个托付 delegate void MyDelegate(string str); //定义一个实名要领 public static void fun(string str) { Console.WriteLine("这是一个 {0} 要领", str); } static void Main(string[] args) { //建立一个托付实例,内里包括一个匿名要领 MyDelegate examp1 = delegate(string name) { Console.WriteLine("这是一个 {0} 要领",name); //代码块 }; examp1("匿名"); //挪用匿名要领 MyDelegate examp2 = new MyDelegate(fun); //在托付中实名注册一个fun定名要领 examp2("实名"); //挪用定名要领 } } }
效果:
匿名要领的参数的局限是“匿名要领块”。
假如目的在块外部,那末,在匿名要领块内运用跳转语句(如 goto、break 或 continue)是毛病的。假如目的在块内部,在匿名要领块外部运用跳转语句(如goto、break 或continue)也是毛病的。
Func<T,Tresult>托付:
之前我们运用delegate托付时必需的提早声明一个delegate类,然后向托付中注册要领,比方:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明托付 public static string Toup(string str) //定义要领 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; MyDelegate my = Toup; //注册要领 Console.WriteLine(my(str));//挪用要领 效果 ABC } } }
假如当前提不允许我们在顺序中声明delegate类,但又须要运用托付时,我们该怎么办呢? 此时我们可以斟酌运用Func托付。Func<string,string>在<>中末了的参数为返回值范例,前面的都是传入要领参数范例,作用与托付相似,但不须要声明,上面的例子改成Func托付:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { public static string Toup(string str) //定义要领 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; Func<string, string> change = Toup; //泛型托付 Console.WriteLine(change(str));//挪用要领 效果 ABC } } }
对照下,二者效果一样,但Func却比Delegate简约了许多,然则Delegate可以加载匿名要领,比方上面的例子我们运用匿名要领:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明托付 static void Main(string[] args) { string str = "abc"; //建立匿名要领 MyDelegate my = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(my(str)); //效果 ABC } } }
Func也行吗? Func也是可以建立匿名要领的,一样的也不须要声明,以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //建立匿名要领 Func<string, string> change = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(change(str)); //效果 ABC } } }
与上面的匿名要领对照我们发明,在建立匿名要领的时刻二者都是经由过程 delegate 来完成的(照样用到了delegate),可不可以不必delegate ,不必它是可以的,这时候我们须要进修lambda 表达式
lambda表达式:
Lambda 表达式是一种可用于建立托付或表达式目次树范例的匿名要领。 经由过程运用 lambda 表达式,可以写入可作为参数通报或作为函数挪用值返回的当地函数。若要建立 Lambda 表达式,须要在 Lambda 运算符 => 左边指定输入参数(假如有),然后在另一侧输入表达式或语句块。 比方,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值。
所以上面的例子我们运用lambda 表达式建立匿名要领改成:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //lambda 表达式 Func<string, string> change = s => s.ToUpper(); //传入string 范例s 返回s.ToUpper(); Console.WriteLine(change(str)); //效果 ABC } } }
在delegate托付范例中,我们也可以运用lambda表达式建立匿名要领:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明托付 static void Main(string[] args) { string str = "abc"; //lambda 表达式 MyDelegate my = s => s.ToUpper(); //传入string 范例s 返回s.ToUpper(); Console.WriteLine(my(str)); //效果 ABC } } }
以上就是 C#进修日志25---匿名要领 与 Func托付 与 lambda表达式的内容,更多相关内容请关注ki4网(www.ki4.cn)!