




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C#五类运算符使用表达式树进行操作在C#中,算术运算符,有以下类型
算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符
这些运算符根据参数的多少,可以分作一元运算符、二元运算符、三元运算符。本文将围绕这些运算符,演示如何使用表达式树进行操作。
对于一元运算符和二元运算符的Expression的子类型如下:
UnaryExpression;//一元运算表达式
BinaryExpression;//二元运算表达式
一,算术运算符
运算符描述+把两个操作数相加-从第一个操作数中减去第二个操作数*把两个操作数相乘/分子除以分母%取模运算符,整除后的余数++自增运算符,整数值增加1--自减运算符,整数值减少1
+与Add()
正常代码
inta;
intb;
a=100;
b=200;
varab=a+b;
Console.WriteLine(ab);
使用表达式树构建
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//ab=a+b
BinaryExpressionab=Expression.Add(a,b);
//打印a+b的值
MethodCallExpressionmethod=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),ab);
ExpressionActionint,intlambda=Expression.LambdaActionint,int(method,a,b);
lambda.Compile()(100,200);
Console.ReadKey();
如果想复杂一些,使用块来执行:
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//别忘记了赋值
BinaryExpressionaa=Expression.Assign(a,Expression.Constant(100,typeof(int)));
BinaryExpressionbb=Expression.Assign(b,Expression.Constant(200,typeof(int)));
//ab=a+b
BinaryExpressionab=Expression.Add(a,b);
//打印a+b的值
MethodCallExpressionmethod=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),ab);
//以块的形式执行代码,相当于{}
//不需要纠结这里,后面会有详细说明,重点是上面
varcall=Expression.Block(newParameterExpression[]{a,b},aa,bb,method);
ExpressionActionlambda=Expression.LambdaAction(call);
lambda.Compile()();
上面两个示例,是使用表达式树计算结果,然后还是使用表达式树打印结果。
前者依赖外界传入参数值,赋予a、b,后者则全部使用表达式树赋值和运算。
那么,如何通过表达式树执行运算,获取执行结果呢?
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//ab=a+b
BinaryExpressionab=Expression.Add(a,b);
ExpressionFuncint,int,intlambda=Expression.LambdaFuncint,int,int(ab,a,b);
intresult=lambda.Compile()(100,200);
Console.WriteLine(result);
Console.ReadKey();
这些区别在于如何编写Expression.Lambda()。
另外,使用AddChecked()可以检查操作溢出。
-与Subtract()
与加法一致,此处不再赘述,SubtractChecked()可以检查溢出。
a-b,结果是100。
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//ab=a-b
BinaryExpressionab=Expression.Subtract(a,b);
ExpressionFuncint,int,intlambda=Expression.LambdaFuncint,int,int(ab,a,b);
intresult=lambda.Compile()(200,100);
Console.WriteLine(result);
乘除、取模
乘法
//ab=a*b
BinaryExpressionab=Expression.Multiply(a,b);
//ab=20000
除法
//ab=a/b
BinaryExpressionab=Expression.Divide(a,b);
//ab=2
取模(%)
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//ab=a%b
BinaryExpressionab=Expression.Modulo(a,b);
ExpressionFuncint,int,intlambda=Expression.LambdaFuncint,int,int(ab,a,b);
intresult=lambda.Compile()(200,150);
//ab=50
Console.WriteLine(result);
Console.ReadKey();
自增自减有两种模型,一种是x++或x--,另一种是++x或--x。
他们都是属于UnaryExpression类型。
算术运算符表达式树说明x++Expression.PostIncrementAssign()后置x--Expression.PostDecrementAssign()后置++xExpression.PreIncrementAssign()前置--xExpression.PreDecrementAssign()前置
巧记:Post后置,Pre前置;Increment是加,Decrement是减;Assign与赋值有关(后面会说到);
x++与x--的使用
inta=10;
intb=10;
a++;
b--;
Console.WriteLine(a);
Console.WriteLine(b);
//inta,b;
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//a=10,b=10;
BinaryExpressionsetA=Expression.Assign(a,Expression.Constant(10));
BinaryExpressionsetB=Expression.Assign(b,Expression.Constant(10));
//a++
UnaryExpressionaa=Expression.PostIncrementAssign(a);
//b--
UnaryExpressionbb=Expression.PostDecrementAssign(b);
//Console.WriteLine(a);
//Console.WriteLine(b);
MethodCallExpressioncallA=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),a);
MethodCallExpressioncallB=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),b);
BlockExpressionblock=Expression.Block(
newParameterExpression[]{a,b},
setA,
setB,
callA,
callB
ExpressionActionlambda=Expression.LambdaAction(block);
lambda.Compile()();
Console.ReadKey();
如果想把参数从外面传入,设置a,b
//inta,b;
ParameterExpressiona=Expression.Variable(typeof(int),"a");
ParameterExpressionb=Expression.Variable(typeof(int),"b");
//a++
UnaryExpressionaa=Expression.PostIncrementAssign(a);
//b--
UnaryExpressionbb=Expression.PostDecrementAssign(b);
//Console.WriteLine(a);
//Console.WriteLine(b);
MethodCallExpressioncallA=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),a);
MethodCallExpressioncallB=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),b);
BlockExpressionblock=Expression.Block(
callA,
callB
ExpressionActionint,intlambda=Expression.LambdaActionint,int(block,a,b);
lambda.Compile()(10,10);
Console.ReadKey();
生成的表达式树如下
.Lambda#Lambda1System.Action`2[System.Int32,System.Int32](
System.Int32$a,
System.Int32$b){
.Block(){
$a++;
$b--;
.CallSystem.Console.WriteLine($a);
.CallSystem.Console.WriteLine($b)
}
为了理解一下Expression.Block(),可以在这里学习一下(后面会说到Block())。
//inta,b;
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
ParameterExpressionc=Expression.Variable(typeof(int),"c");
BinaryExpressionSetA=Expression.Assign(a,c);
BinaryExpressionSetB=Expression.Assign(b,c);
//a++
UnaryExpressionaa=Expression.PostIncrementAssign(a);
//b--
UnaryExpressionbb=Expression.PostDecrementAssign(b);
//Console.WriteLine(a);
//Console.WriteLine(b);
MethodCallExpressioncallA=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),a);
MethodCallExpressioncallB=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),b);
BlockExpressionblock=Expression.Block(
newParameterExpression[]{a,b},
SetA,
SetB,
callA,
callB
ExpressionActionintlambda=Expression.LambdaActionint(block,c);
lambda.Compile()(10);
Console.ReadKey();
为什么这里要多加一个c呢?我们来看看生成的表达式树
.Lambda#Lambda1System.Action`1[System.Int32](System.Int32$c){
.Block(
System.Int32$a,
System.Int32$b){
$a=$c;
$b=$c;
$a++;
$b--;
.CallSystem.Console.WriteLine($a);
.CallSystem.Console.WriteLine($b)
}
观察一下下面代码生成的表达式树
//inta,b;
ParameterExpressiona=Expression.Parameter(typeof(int),"a");
ParameterExpressionb=Expression.Parameter(typeof(int),"b");
//a++
UnaryExpressionaa=Expression.PostIncrementAssign(a);
//b--
UnaryExpressionbb=Expression.PostDecrementAssign(b);
//Console.WriteLine(a);
//Console.WriteLine(b);
MethodCallExpressioncallA=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),a);
MethodCallExpressioncallB=Expression.Call(null,typeof(Console).GetMethod("WriteLine",newType[]{typeof(int)}),b);
BlockExpressionblock=Expression.Block(
newParameterExpression[]{a,b},
callA,
callB
ExpressionActionint,intlambda=E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术素材考试题及答案
- 商业楼宇中央空调改造工程协议
- 市场推广制作与执行合同书
- 在线服务隐私保护合同协议书
- 金融投资产品开发协议
- 贵州国企招聘2025贵州磷化(集团)有限责任公司招聘139人笔试参考题库附带答案详解
- 2025黑龙江中铁特货物流股份有限公司招聘75人笔试参考题库附带答案详解
- 2025广东储能产业发展有限公司招聘17人笔试参考题库附带答案详解
- 2025年甘肃人力委托招聘兰州地铁安检人员笔试参考题库附带答案详解
- 赠友送别类试题及答案
- 《建筑装饰设计收费标准》(2024年版)
- 肾上腺皮质功能减退症的护理
- 2025届高考语文专项【语用新增题型】修改错别字名校最模拟题
- 《腹泻的临床思维》课件
- 留学项目宣讲流程设计
- DBJT45-003-2014 广西壮族自治区城镇生活垃圾卫生填埋场运行、维护及考核评价标准
- DB31T 1419-2023医疗付费“一件事”应用规范
- Unit1 Greetings(说课稿)2024-2025学年人教精通版(2024)英语三年级上册
- 2025年度涉密电子设备研发与生产保密协议范本
- 《中国染织史》第九章-五代、两宋的染织工艺
- 2025年全国青少年禁毒知识竞赛中学生组题库及答案(共120题) - 副本
评论
0/150
提交评论