delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树
2012-08-08 17:13
549 查看
1.delegate
MSDN:一种安全地封装方法的类型,它与C和C++中的函数指针类似。与C中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义
classProgram
{
constintnum=100;
delegatebooldelCompare(inta);
staticvoidMain(string[]args)
{
delComparehander=DelegateMethod;
hander(1);
}
publicstaticboolDelegateMethod(inta)
{
returna>num;
}
}
用ILDisassemble查看
匿名委托:
匿名委托即使用了匿名方法的委托,IL层中的代码中会为匿名函数生一个静态的函数,本次的代码中的函数名是:CS$<>9__CachedAnonymousMethodDelegate1
classProgram
{
constintnum=100;
delegatebooldelCompare(inta);
staticvoidMain(string[]args)
{
delComparedel=delegate(inta){returna>num;};
}
}
用ILDisassemble查看
Lambda表达式
使用Lambda表达式与上一个Demo中使用匿名函数生成的IL代码是完全一样的
classProgram
{
constintnum=100;
delegatebooldelCompare(inta);
staticvoidMain(string[]args)
{
delComparedel=a=>a>num;
}
}
Func<T1..TResult>
使用Func<T1…TResult>中的Demo中,在IL层代中有所不同。代码中没有用到delegate,相当于在Main方法中直接调用了一个静态方法。理论上Func<T1…TResult>比delegate在时间和空间的效率都要高
classProgram
{
constintnum=100;
//delegatebooldelCompare(inta);
staticvoidMain(string[]args)
{
Func<int,bool>del=a=>a>num;
}
}
Expression(TDelegate)
表达式目录树以数据形式表示语言级别代码。数据存储在树形结构中。表达式目录树中的每个节点都表示一个表达式。以下Demo中IL层的代码中并未生成任何静态函数。
classProgram
{
constintnum=100;
//delegatebooldelCompare(inta);
staticvoidMain(string[]args)
{
Expression<Func<int,bool>>exp=a=>a>num;//生在表达式
Func<int,bool>fun=exp.Compile();//编辑表达式
fun(1);//执行表达式
}
}
查看Main函数,在IL层代码中会对Expression动太编译生成实例!0,再通过Invoke(!0)调用方法
IL_0045:callvirtinstance!0class[System.Core]System.Linq.Expressions.Expression`1<class[mscorlib]System.Func`2<int32,bool>>::Compile()
IL_004a:stloc.1
IL_004b:ldloc.1
IL_004c:ldc.i4.1
IL_004d:callvirtinstance!1class[mscorlib]System.Func`2<int32,bool>::Invoke(!0)
IL_0052:pop
IL_0053:ret
总结:
匿名delegate和Lambda表达式本质是一样的,Func<T1..TResult>委托与delegate不同,它没有委托的异常调用等特性,在IL层生成的代码不同,执行方式不同。Expression(TDelegate)则是语言级别的,用于动太生成表达式,理论上Expression(TDelegate)效率最差。但在Linq表达式中必须用到
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树
- delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数
- Lambda 表达式创建委托Action和Func时的简单使用
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
- [原] C# 3.0的委托(delegate)及Lambda表达式应用实例
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
- Func和Action,委托与lambda表达式,一看就知道
- 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
- 匿名方法、Lambda表达式、Func<>委托
- 通过Func 委托理解委托和匿名方法及Lambda 表达式
- 委托 匿名方法 Lambda表达式 总结(yuananl)
- 温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
- linq基础,委托,lambda表达式
- [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式
- 【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、Lambda 表达式
- C#委托的介绍(delegate、Action、Func、predicate)(转)
- C#委托的介绍(delegate、Action、Func、predicate)ga
- C# 委托应用总结(委托,Delegate,Action,Func,predicate)