表达式树练习实践:变量、常量与赋值
程序员文章站
2022-08-04 13:57:10
表达式树练习实践:变量、常量与赋值 定义变量 用来创建变量、变量参数表达式。 在 C 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 一般上,只用到值类型和引用类型,这里不会说到指针类型。 C 的基本值 ......
表达式树练习实践:变量、常量与赋值
定义变量
parameterexpression
用来创建变量、变量参数表达式。
在 c# 中,变量分为以下几种类型:
- 值类型(value types)
- 引用类型(reference types)
- 指针类型(pointer types)
一般上,只用到值类型和引用类型,这里不会说到指针类型。
c#的基本值类型有:bool、byte、char、double、float、int、long等(c#中,数组属于引用类型)。
表达式树创建一个有两种方式变量:
parameterexpression vara = expression.variable(typeof(int), "x"); parameterexpression varb = expression.parameter(typeof(int), "y");
区别:
expression.variable()
表示创建一个变量;
expression.parameter()
表示创建一个传入参数;
至于使用区别,后面会有很多具体示例可以体会到。
相同点:生成的类型都是 parameterexpression
。
实例:
int a; parameterexpression vara = expression.variable(typeof(int), "x");
static void main(string[] args) { // 等同 test()里的 int b parameterexpression varb = expression.parameter(typeof(int), "y"); console.readkey(); } public static void test(int b) { console.writeline(b); }
引用类型亦是使用相同方法创建变量。
关于引用类型的示例方法,后面会使用到。
定义常量
使用 expression.constan()
定义一个常量。
示例:
constantexpression constant = expression.constant(100); constantexpression constant1 = expression.constant(100, typeof(int));
建议使用两个参数的重载方法,这样浏览代码是,能够快速理解,便于查找修改。
赋值
expression.assign()
用于给表达式树变量赋值。
常用定义如下
binaryexpression assign(expression left, expression right);
将右边表达式的值,赋予左边表达式。
为变量赋值:
parameterexpression a = expression.variable(typeof(int), "x"); constantexpression constant = expression.constant(100, typeof(int)); binaryexpression assign = expression.assign(a, constant);
注意重载方法类型
console
的常用重载方法有
public static void writeline(object value); public static void writeline(float value); public static void writeline(string value);
在使用表达式树时,注意要调用的重载方法,不能被正常代码的隐式转换误导。
int a = 100; console.writeline(a); parameterexpression aa = expression.parameter(typeof(int), "a"); binaryexpression aaa = expression.assign(aa, expression.constant(100, typeof(int))); methodcallexpression method = expression.call(null, typeof(console).getmethod("writeline", new type[] { typeof(string) }), aa); // 如果没有学到过执行表达式树,现在可以先忽略这里 var call = expression.block(new parameterexpression[] { aa }, aaa, method); expression<action> lambda = expression.lambda<action>(call); lambda.compile()();
前面输出 变量 a ,系统会进行隐式的类型转换。但是使用表达式树调用方法,要对应类型才行,以便找到正确的重载方法。上面的表达式树调用 console.writeline()
会报如下错误:
system.argumentexception:“expression of type 'system.int32' cannot be used for parameter of type 'system.string' of method 'void writeline(system.string)' arg_paramname_name”