Дополнительные скобки в коде, сгенерированном 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");
}

Опять же, я знаю, что лишние скобки ни на что не влияют, но если я делаю что-то не так, я хотел бы знать :)


person Mike Caron    schedule 30.05.2011    source источник


Ответы (2)


Я предполагаю, что авторы CodeDom не чувствовали, что преимущество немного более чистого кода будет перевешивать использование драгоценного процессорного времени, необходимого для обнаружения необходимости в круглых скобках. В некоторых других случаях они могли бы быть действительно необходимы.

person Jan-Peter Vos    schedule 30.05.2011
comment
Это кажется столь же разумным, как и все. В конце концов, сгенерированный код не предназначен для просмотра :) - person Mike Caron; 31.05.2011
comment
@Mike Caron: за исключением случаев, когда вы пытаетесь отладить сгенерированный код или сам генератор кода. Был там, сделал это. (Не то чтобы это проблема с дополнительными фигурными скобками :-) - person Christian.K; 31.05.2011

Выглядит хорошо для меня. Я получаю один и тот же результирующий код целую вечность.

Если вас интересует только генерация кода для C#, вы можете указать условие с помощью CodeSnippetExpression, избегая лишних скобок. Ваш способ более общий.

Под капотом IL не выполняет разрешение скобок (это работа компилятора), поэтому, если скобки могут понадобиться, они будут включены явно.

person GregC    schedule 30.05.2011