委托 匿名方法 Lambda表达式 总结(yuananl)
2009-08-12 19:15
881 查看
委托匿名方法Lambda表达式总结(yuananl)
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托就是给一个函数起一个别的名字。请看下面的代码:
usingSystem;//一般情况下系统会自动引入该命名空间
漫画
//Declaredelegate--definesrequiredsignature:
delegatevoidSampleDelegate(stringmessage);//声明一委托类型
classMainClass
{
//Regularmethodthatmatchessignature:
staticvoidSampleDelegateMethod(stringmessage)//一静态方法
{
Console.WriteLine(message);
}
staticvoidMain()
{
//Instantiatedelegatewithnamedmethod:用一个已经声明的方法初始化一委托对象
SampleDelegated1=SampleDelegateMethod;//声明一委托对象并为之挂接一方法
//Instantiatedelegatewithanonymousmethod用一个匿名方法来初始化一委托对象
SampleDelegated2=delegate(stringmessage)//
{
Console.WriteLine(message);
};
d1("Hello");output:Hello
d2("World,http://www.dc9.cn/");output:World,http://www.dc9.cn/
}
}
下面的是一事件(特殊类型的委托)
publicForm1()
{
InitializeComponent();
this.Click+=this.MultiHandler;//窗体的单击事件挂接下面的一事件
}
privatevoidMultiHandler(objectsender,System.EventArgse)
{
MessageBox.Show(((MouseEventArgs)e).Location.ToString());
}
匿名方法
匿名方法就是没名儿的委托。虽然没名,但是必须加”delegate“来表示我没名。
//Createadelegateinstance
delegatevoidDel(intx);
//Instantiatethedelegateusingananonymousmethod
Deld=delegate(intk){/*...*/};等价于
Deld=delegate(intk)
{语句}
Deld=delegate(){System.Console.WriteLine("Copy#:{0}",++n);};
delegatevoidPrinter(strings);//又一索引(其参数为string类型)
Printerp=delegate(stringj)//匿名方法:即P所关联的方法(匿名)
{
System.Console.WriteLine(j);
};
p("Thedelegateusingtheanonymousmethodiscalled.");
delegatestringPrinter(strings);
privatevoidbutton1_Click(objectsender,EventArgse)
{
Printeryuanl=delegate(stringj)
{
return(j)+"烦死了";
};
Console.WriteLine(yuanl("Thedelegateusingtheanonymousmethodiscalled."));
}
delegatevoidPrinter(strings);
privatevoidbutton1_Click(objectsender,EventArgse)
{
Printerp=newPrinter(Form1.DoWork);
p("http://www.dc9.cn/");
}
staticvoidDoWork(stringk)
{
System.Console.WriteLine(k);
}
漫画使用Lambda表达式可以这么写:
delegatestringPrinter(strings);
privatevoidbutton1_Click(objectsender,EventArgse)
{
Printeryuanl=j=>j+"烦死了!!!";
Console.WriteLine(yuanl("Thedelegateusingtheanonymousmethodiscalled."));
}
publicForm1()
{
InitializeComponent();
this.Click+=(s,e)=>{MessageBox.Show(((MouseEventArgs)e).Location.ToString());};
}
注意(s,e)的含义:S事件的发送者,e承载传递的数据
Where是Enumerable的一个方法。3.5才有的。里面的参数是Func<(Of<(T,TResult>)>)泛型委托
Func<(Of<(T,TResult>)>)泛型委托
//下面的代码是一典型的委托应用
usingSystem;
delegatestringConvertMethod(stringinString);
publicclassDelegateExample
{
publicstaticvoidMain()
{
ConvertMethodconvertMeth=UppercaseString;
stringname="Dakota";
Console.WriteLine(convertMeth(name));
}
privatestaticstringUppercaseString(stringinputString)
{
returninputString.ToUpper();
}
}
写成泛型委托是:
usingSystem;
publicclassGenericFunc
{
publicstaticvoidMain()
{
Func<string,string>convertMethod=UppercaseString;
stringname="Dakota";
Console.WriteLine(convertMethod(name));
}
privatestaticstringUppercaseString(stringinputString)
{
returninputString.ToUpper();
}
}
lambda应用
delegateboolTestFunc(stringfruit);
privatevoidbutton1_Click(objectsender,EventArgse)
{
List<string>fruits=newList<string>{"apple","http://www.dc9.cn","banana","mango",
"orange","blueberry","grape","strawberry"};
TestFuncf=newTestFunc(DoWork);
Func<string,bool>f2=DoWork;
IEnumerable<string>query=fruits.Where(f2);//典型委托
foreach(stringfruitinquery)
Console.WriteLine(fruit);
}
privatestaticboolDoWork(stringk)
{
returnk.Length<6;
}
等价于下面:
delegateboolTestFunc(stringfruit);
privatevoidbutton1_Click(objectsender,EventArgse)
{
List<string>fruits=newList<string>{"apple","passionfruit","banana","mango",
"orange","blueberry","grape","http://www.dc9.cn"};
TestFuncf=DoWork;
Func<string,bool>f2=k=>k.Length<6;//lambda表达式
IEnumerable<string>query=fruits.Where(f2);
foreach(stringfruitinquery)
Console.WriteLine(fruit);
}
privatestaticboolDoWork(stringk)
{
returnk.Length<6;
}
还等价于:
漫画
privatevoidbutton1_Click(objectsender,EventArgse)
{
List<string>fruits=newList<string>{"apple","passionfruit","banana","mango",
"orange","blueberry","grape","http://www.dc9.cn"};
IEnumerable<string>query=fruits.Where(
delegate(stringk){
returnk.Length<6;
}
);//匿名函数
foreach(stringfruitinquery)
Console.WriteLine(fruit);
}
还等价于:
privatevoidbutton1_Click(objectsender,EventArgse)
{
List<string>fruits=newList<string>{"apple","passionfruit","banana","mango",
"orange","blueberry","grape","http://www.dc9.cn"};
IEnumerable<string>query=fruits.Where(k=>k.Length<6);//lambda表达式
foreach(stringfruitinquery)
Console.WriteLine(fruit);
}
注意看下面的这几句:
publicdelegatestringyuanl(stringa,stringb);
stringyuan="yuanl";
stringan="anxl";
publicstaticclassLambdaTest
{
publicstaticstringyuananl(thisstringa,stringy,yuanlyl)
{
returnyl(a,y);
}
}
Console.WriteLine(yuan.yuananl(an,(yuan,an)=>yuan+"love"+an));
相关文章推荐
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数
- 匿名方法、委托和Lambda表达式区分演示(图文解释)
- 委托、匿名方法、Lambda表达式的演进
- C# 委托的发展史: .Net 1.x 委托 =>.Net 2.x 匿名方法 => .Net 3.0/3.5 Lambda 表达式
- 第八章(3)-委托的匿名方法与Lambda表达式-学习笔记
- 匿名方法、Lambda表达式、Func<>委托
- 匿名方法、委托和Lambda表达式区分演示(图文解释)
- 从委托到匿名方法,再到Lambda表达式
- 委托、匿名方法和 Lambda 表达式
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
- C# 匿名委托、匿名方法、匿名对象、Lambda表达式
- 委托、匿名方法、Lambda表达式的演进
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
- Lambda表达式_匿名方法_委托
- 委托、匿名方法、Lambda表达式的演进
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
- 委托、匿名方法、Lambda表达式的演进
- 从委托到匿名方法,再到Lambda表达式
- 委托、匿名方法、Lambda表达式的演进