前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >表达式树练习实践:变量、常量与赋值

表达式树练习实践:变量、常量与赋值

作者头像
痴者工良
发布2021-04-26 09:58:27
发布2021-04-26 09:58:27
59200
代码可运行
举报
文章被收录于专栏:痴者工良痴者工良
运行总次数:0
代码可运行

表达式树练习实践:变量、常量与赋值

定义变量

ParameterExpression 用来创建变量、变量参数表达式。

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

一般上,只用到值类型和引用类型,这里不会说到指针类型。

C#的基本值类型有:bool、byte、char、double、float、int、long等(C#中,数组属于引用类型)。

表达式树创建一个有两种方式变量:

代码语言:javascript
代码运行次数:0
运行
复制
            ParameterExpression varA = Expression.Variable(typeof(int), "x");
            ParameterExpression varB = Expression.Parameter(typeof(int), "y");

区别:

Expression.Variable()表示创建一个变量;

Expression.Parameter()表示创建一个传入参数;

至于使用区别,后面会有很多具体示例可以体会到。

相同点:生成的类型都是 ParameterExpression

实例:

代码语言:javascript
代码运行次数:0
运行
复制
            int a; 

            ParameterExpression varA = Expression.Variable(typeof(int), "x");
代码语言:javascript
代码运行次数:0
运行
复制
        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() 定义一个常量。

示例:

代码语言:javascript
代码运行次数:0
运行
复制
            ConstantExpression constant = Expression.Constant(100);
            ConstantExpression constant1 = Expression.Constant(100, typeof(int));

建议使用两个参数的重载方法,这样浏览代码是,能够快速理解,便于查找修改。

赋值

Expression.Assign() 用于给表达式树变量赋值。

常用定义如下

代码语言:javascript
代码运行次数:0
运行
复制
BinaryExpression Assign(Expression left, Expression right);

将右边表达式的值,赋予左边表达式。

为变量赋值:

代码语言:javascript
代码运行次数:0
运行
复制
            ParameterExpression a = Expression.Variable(typeof(int), "x");

            ConstantExpression constant = Expression.Constant(100, typeof(int));

            BinaryExpression assign = Expression.Assign(a, constant);

注意重载方法类型

Console 的常用重载方法有

代码语言:javascript
代码运行次数:0
运行
复制
        public static void WriteLine(object value);

        public static void WriteLine(float value);

        public static void WriteLine(string value);

在使用表达式树时,注意要调用的重载方法,不能被正常代码的隐式转换误导。

代码语言:javascript
代码运行次数:0
运行
复制
            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() 会报如下错误:

代码语言:javascript
代码运行次数:0
运行
复制
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”
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表达式树练习实践:变量、常量与赋值
    • 定义变量
    • 定义常量
    • 赋值
    • 注意重载方法类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档