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
。这是我个人的喜好,但这让这类事情对我来说很重要。