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

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

定义变量


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”
相关文章
|
6月前
|
存储 Unix 编译器
变量和常量
这篇内容介绍了编程中的变量概念和使用。变量是可变的存储单元,用于存放数据,其值在程序运行期间可以改变。变量需先定义后使用,声明时指定类型,如`类型关键字 变量名;`。变量可分为局部变量(在代码块内定义)和全局变量(代码块外),全局变量在整个程序中可见,局部变量只在定义它的代码块内有效。初始化变量时,未赋值的变量值可能是随机的。编程最佳实践建议使用有意义的标识符,并遵循特定平台的风格。此外,常量是不可变的,可以通过宏常量(`#define`)或`const`关键字定义,常量有助于提高代码可读性和维护性。不同数据类型支持不同的运算操作。
42 0
|
6月前
|
存储 C语言
变量和常量的例子
变量和常量的例子
45 1
|
6月前
|
存储 C++ 容器
【C/C++】C/C++编程——变量和常量
【C/C++】C/C++编程——变量和常量
91 0
|
Java
1.3 常量与变量
1.3 常量与变量
51 0
|
编译器 C语言
【常量与变量的一些基本理解】
【常量与变量的一些基本理解】
75 0
|
编译器 C语言
C语言基础知识:变量 (局部和全局)与常量(枚举常量.....)
C语言基础知识:变量 (局部和全局)与常量(枚举常量.....)
80 0
变量、常量
c语言学习的第二弹
|
存储 编译器 C#
【C#基础】C# 变量与常量的使用
编程语言 C# 变量和常量的介绍。
158 0
【C#基础】C# 变量与常量的使用
|
编译器 C++
<C++>运算符重载完结,详解赋值,关系,函数调用运算符
<C++>运算符重载完结,详解赋值,关系,函数调用运算符
150 0
<C++>运算符重载完结,详解赋值,关系,函数调用运算符
下一篇
无影云桌面