gpt4 book ai didi

C#:字符串参数被神秘地重置为空 - 请帮忙!

转载 作者:太空狗 更新时间:2023-10-29 22:08:40 24 4
gpt4 key购买 nike

我正在试验解析表达式树并编写了以下代码:

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() 方法),我发现它是空的。

当我使用调试器单步执行代码时,我发现当代码第一次执行 HandleParameterExpression() 时,输出被正确设置为“x”,但是一旦控制返回从 HandleParameterExpression() 回到 HandleExpression() 中的 switch block ,变量再次神秘地为空。

由于字符串是引用类型,我应该能够简单地在方法之间传递引用,并且应该保留方法对其值所做的更改,对吗?在 C# 中传递参数是否有一些我不知道的微妙之处?

最佳答案

您永远不会更改字符串的数据,因为它是不可变的。

每次你有:

output += something;

也就是说:

output = output + something;

“output + something”的值实际上是调用 String.Concat(output, something) 的结果 - 即对新字符串的引用。因此,您的代码正在更改 variable output 的值以引用新字符串。现有字符串中的数据保持不变。

更改参数的值不会更改调用方中的相应值,除非参数通过引用传递(使用refout)。看我的article on parameter passing更多细节。请注意按值传递引用和按引用传递变量之间的区别。

我建议您更改代码以改用 StringBuilder

关于C#:字符串参数被神秘地重置为空 - 请帮忙!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com