zoukankan      html  css  js  c++  java
  • 表达式树练习实践:变量、常量与赋值

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

    定义变量

    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”
    
  • 相关阅读:
    经典SQL语句大全
    MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
    Compilify——让你在浏览器中编译.NET代码
    Apache CouchDB 1.2.0新特性
    word转chm格式文档非常好用的转换工具
    ReSharper 6 Beta发布,商业.NET开发工具
    HTML.Next会给我们带来什么?
    在并行方法体中谨慎使用锁
    7款仿照Sinatra思路的.NET框架
    数据库工件的配置管理
  • 原文地址:https://www.cnblogs.com/whuanle/p/11530555.html
Copyright © 2011-2022 走看看