您的位置:首页 > 其它

委托 匿名方法 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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: