Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定表达式是否为常量表达式的最佳方法_C#_Expression Trees - Fatal编程技术网

C# 确定表达式是否为常量表达式的最佳方法

C# 确定表达式是否为常量表达式的最佳方法,c#,expression-trees,C#,Expression Trees,如果表达式是ConstantExpression,您更喜欢哪一个用于测试?从节点类型属性或类型转换,为什么 public static bool IsConstantExpression(Expression expression) { return expression.NodeType == ExpressionType.Constant; return expression is ConstantExpression; } 一个区别

如果表达式是
ConstantExpression
,您更喜欢哪一个用于测试?从
节点类型
属性或类型转换,为什么

    public static bool IsConstantExpression(Expression expression)
    {
        return expression.NodeType == ExpressionType.Constant;
        return expression is ConstantExpression;
    }


一个区别是
expression.NodeType==ExpressionType。如果
expression
为null,常量将引发异常。我非常确定
ConstantExpression
是可空的,因此该语句仍然有效。

一个区别是
expression.NodeType==ExpressionType。如果
expression
为空,常量将引发异常。我很确定
ConstantExpression
可以为空,因此,该语句仍然有效。

我认为进行属性访问比让运行时检查对象的类型好。

我认为进行属性访问比让运行时检查对象的类型好。

ConstantExpression
没有密封,因此,有人可以重写
节点类型
,并返回其他内容。根据NodeType的文档,“当重写此方法时,扩展节点应返回ExpressionType.Extension”。@vcsjones但其唯一的构造函数是
internal
,因此重写仅限于mscorlib。@斯维克:好的一点,我没有注意到。
ConstantExpression
没有密封,因此,有人可以重写
节点类型
,并返回其他内容。根据NodeType的文档,“当重写此方法时,扩展节点应返回ExpressionType.Extension”。@vcsjones但其唯一的构造函数是
internal
,因此重写仅限于mscorlib。@svick哦,好的一点,我没有注意到。你为什么这么想?CLR中的类型检查非常便宜。这是一个简单的Isinst指令。属性可以做各种有趣的事情,比如调用成员,如果还没有完成,就需要进行JIT,等等@Vcsjones,有趣!你有更深入解释的链接吗?那太不具体了。在哪方面更好?你为什么这么想?你为什么这么想?CLR中的类型检查非常便宜。这是一个简单的Isinst指令。属性可以做各种有趣的事情,比如调用成员,如果还没有完成,就需要进行JIT,等等@Vcsjones,有趣!你有更深入解释的链接吗?那太不具体了。在哪方面更好?你为什么会这样想?
ConstantExpression
是一个类,所以是的,它可以是
null
。但另一个问题是:如果传入无效数据(
null
),抛出异常不是更好吗?@svick这可能取决于您对代码所做的操作。如果你正在做一些值可能为null的事情(没有想到具体的例子),你需要根据它是否为null做不同的事情。当我处理datetime对象时(不是在这些情况下,只是在一般情况下),如果没有分配它们,我通常会将它们设置为null,而不是使用默认的
MinValue
。这是我个人的喜好,但它让这类事情对我来说很重要。
ConstantExpression
是一个类,所以是的,它可以是
null
。但另一个问题是:如果传入无效数据(
null
),抛出异常不是更好吗?@svick这可能取决于您对代码所做的操作。如果你正在做一些值可能为null的事情(没有想到具体的例子),你需要根据它是否为null做不同的事情。当我处理datetime对象时(不是在这些情况下,只是在一般情况下),如果没有分配它们,我通常会将它们设置为null,而不是使用默认的
MinValue
。这是我个人的喜好,但这让这类事情对我来说很重要。