2013-07-15 5 views
1

표현식이 ConstantExpression 인 경우 테스트하려는 것은? NodeType 속성이나 캐스트에서 왜?표현식이 상수 표현식인지 확인하는 가장 좋은 방법

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

'ConstantExpression'은 봉인되어 있지 않으므로 누군가가 NodeType을 무시하고 다른 것을 반환 할 수 있습니다. NodeType에 대한 문서에 따르면 "확장 노드는이 메서드를 재정의 할 때 ExpressionType.Extension을 반환해야합니다." – vcsjones

+0

@vcsjones 그러나 유일한 생성자는'internal'이므로 무시가 mscorlib로 제한됩니다. – svick

+0

@svick 오, 좋은 점, 나는 그것을 알아 차리지 못했다. – vcsjones

답변

1

차이점은 expression.NodeType == ExpressionType.Constant인데 expression이 null 인 경우 예외가 발생합니다. ConstantExpression이 nullable이라는 것이 확실하기 때문에이 문장은 여전히 ​​유효합니다.

+0

'ConstantExpression'은 클래스이므로,'null'이 될 수 있습니다. 그러나 또 다른 질문은 : 잘못된 데이터 ('null')를 전달하면 예외를 던지는 것이 낫지 않은가요? – svick

+0

@svick 아마도 코드로 무엇을하고 있는지에 달려 있습니다. 값이 널 (null)이 될 수있는 무언가를하고 있다면 (특별한 예는 마음에 들지 않습니다) 널 (null)인지 아닌지에 따라 다른 작업을 수행해야합니다. 내가 datetime 객체를 처리 할 때 (이 경우가 아니라 일반적으로), 디폴트로 'MinValue'를 사용하는 대신 할당되지 않았다면 null로 설정합니다. 그것은 개인적인 취향이지만, 그것은 나에게 이런 종류의 일을 중요하게 만듭니다. – cost

0

속성 액세스를 수행하면 런타임에서 객체의 유형을 확인하는 것보다 낫다고 생각합니다.

+0

왜 그렇게 생각하니? CLR의 유형 검사는 저렴합니다. 그것은 간단한'Isinst' 명령입니다. 속성은 JITing이 필요하지 않은 모든 종류의 재미있는 것들을 호출합니다. – vcsjones

+0

@Vcsjones, interesting! 더 자세한 설명을위한 링크가 있습니까? – Toto

+0

그것은 매우 특이하지 않습니다. 어떤면에서 더 나아 졌습니까? 왜 상상할 수 있니? – svick

관련 문제