C #: String parameter mysteriously reset empty - please help!

I am experimenting with parsing tree expressions and wrote the following code:

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();
  }

The idea of ​​the code is to parse the expression tree and write the node data to the output of the string variable. However, when this variable is written to the page (using the method Output()), I find it empty.

When I use the debugger to execute code, I believe that the output is correctly set to "x" when the code executes HandleParameterExpression()for the first time, but as soon as the control returns from HandleParameterExpression()back to switch block in HandleExpression(), the variable is mysteriously empty again.

, , , , ? - #, ?

+5
4

, . , :

private void HandleOrElseExpression(Expression expression, ref string output)

, , :

HandleOrElseExpression(expression, ref output)
+6

, .

, :

output += something;

:

output = output + something;

"output + something" String.Concat(output, something) - . , output . .

, ( ref out). . . .

, StringBuilder.

+8

, , output, output, .

output ref.

+3

It looks like you want to use the options out:

Example: change private void HandleExpression(Expression expression, string output)to private void HandleExpression(Expression expression, out string output)and replace HandleExpression(expression.Body, output);with. HandleExpression(expression.Body, out output); Then the entry in outputthe method will affect the argument passed to the function.

+1
source

All Articles