#c# #.net #codedom
#c# #.net #codedom
Вопрос:
Я использую CodeDom для генерации кода, который будет скомпилирован позже, и я заметил, что некоторые конструкции создают дополнительные наборы круглых скобок. Хотя я знаю, что они ни на что не влияют, они выглядят странно.
Пример кода, который это делает, таков:
new CodeConditionStatement(
new CodeBinaryOperatorExpression(
new CodePropertyReferenceExpression(new CodePropertySetValueReferenceExpression(),
"Length"),
CodeBinaryOperatorType.GreaterThan,
new CodePrimitiveExpression(strLength)
),
new CodeThrowExceptionStatement(
new CodeObjectCreateExpression(typeof(ArgumentException),
new CodePrimitiveExpression("The string is too long"),
new CodePrimitiveExpression("value"))
)
)
При этом генерируется следующий фрагмент:
if ((value.Length > 50)) {
throw new System.ArgumentException("The string is too long", "value");
}
Опять же, я знаю, что дополнительные круглые скобки ни на что не влияют, но если я делаю что-то неправильно для этого, я хотел бы знать 🙂
Ответ №1:
Я предполагаю, что авторы CodeDom не посчитали, что преимущество немного более чистого кода перевесит использование драгоценного процессорного времени, необходимого для определения необходимости в круглых скобках. В некоторых других случаях они, возможно, были действительно необходимы.
Комментарии:
1. Это кажется таким же разумным, как и все остальное. В конце концов, сгенерированный код не предназначен для просмотра 🙂
2. @Mike Caron: за исключением случаев, когда вы пытаетесь отладить этот сгенерированный код или сам генератор кода. Был там, сделал это. (Хотя это не проблема с дополнительными фигурными скобками 🙂
Ответ №2:
На мой взгляд, выглядит неплохо. Я получаю один и тот же результирующий код целую вечность.
Если вас интересует только code gen для C #, вы могли бы сформулировать условие с помощью CodeSnippetExpression, избегая дополнительных круглых скобок. Ваш способ более общий.
По сути, IL не выполняет разрешение круглых скобок (это работа компилятора), поэтому, если круглые скобки могут понадобиться, они будут включены явно.