C #: Строковый параметр таинственным образом сбрасывается на пустой - пожалуйста, помогите!

Я экспериментирую с синтаксическим анализом деревьев выражений и написал следующий код:

private void TestExpressionTree()
  {
    Expression<Func<int, bool>> expression = x => x == 1 || x == 2;
    string output = String.Empty;
    HandleExpression(expression.Body, output);
    Output("Output", output);
  }

  private void HandleExpression(Expression expression, string output)
  {
    switch (expression.NodeType)
    {
      case ExpressionType.Conditional:
        HandleConditionalExpression(expression, output);
        break;
      case ExpressionType.OrElse:
        HandleOrElseExpression(expression, output);
        break;
      case ExpressionType.Equal:
        HandleEqualExpression(expression, output);
        break;
      case ExpressionType.Parameter:
        HandleParameterExpression(expression, output);
        break;
      case ExpressionType.Constant:
        HandleConstantExpression(expression, output);
        break;
    }
  }

  private void HandleConditionalExpression(Expression expression, string output)
  {
    ConditionalExpression conditionalExpression = (ConditionalExpression) expression;
    HandleExpression(conditionalExpression.Test, output);
  }

  private void HandleOrElseExpression(Expression expression, string output)
  {
    BinaryExpression binaryExpression = (BinaryExpression)expression;
    HandleExpression(binaryExpression.Left, output);
    output += "||";
    HandleExpression(binaryExpression.Right, output);
  }

  private void HandleEqualExpression(Expression expression, string output)
  {
    BinaryExpression binaryExpression = (BinaryExpression)expression;
    HandleExpression(binaryExpression.Left, output);
    output += "=";
    HandleExpression(binaryExpression.Right, output);
  }

  private void HandleParameterExpression(Expression expression, string output)
  {
    ParameterExpression parameterExpression = (ParameterExpression)expression;
    output += parameterExpression.Name;
  }

  private void HandleConstantExpression(Expression expression, string output)
  {
    ConstantExpression constantExpression = (ConstantExpression)expression;
    output += constantExpression.Value.ToString();
  }

Идея кода состоит в том, чтобы анализировать дерево выражений и записывать подробности об узлах в выходные данные строковой переменной. Однако, когда эта переменная записывается на страницу (с использованием метода Output () ), я нахожу ее пустой.

Когда я использую отладчик для пошагового выполнения кода, я обнаруживаю, что вывод правильный устанавливается в 'x', когда код выполняет HandleParameterExpression () в первый раз, но как только управление возвращается из HandleParameterExpression () обратно в блок переключения в HandleExpression ( ) , переменная снова загадочно пуста.

Поскольку строки являются ссылочными типами, я должен просто иметь возможность передавать ссылку между методами, и изменения ее значения, сделанные методами, должны быть сохранены, верно? Есть ли какие-то тонкости передачи параметров в C #, о которых я не знаю?

5
задан David 2 December 2010 в 13:57
поделиться