ser*_*iol 5 c# increment tostring operator-precedence
我在C#/ WPF中添加了一个意外的行为
private void ButtonUp_Click(object sender, RoutedEventArgs e)
{
int quant;
if( int.TryParse(Qnt.Text, out quant))
{
string s = ((quant++).ToString());
Qnt.Text = s;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我将quant设为1,则quant将增加到2.但s字符串将为1.这是优先级问题吗?
编辑:
我把它重写为:
quant++;
Qnt.Text = quant.ToString();
Run Code Online (Sandbox Code Playgroud)
现在这可以按照我的预期运作.
问题是你使用的是后增量而不是预增量...但为什么要编写这个复杂的代码呢?只需将副作用(递增)和ToString调用分开:
if (int.TryParse(Qnt.Text, out quant))
{
quant++;
Qnt.Text = quant.ToString();
}
Run Code Online (Sandbox Code Playgroud)
或者甚至放弃实际增量,因为你不会再次读取该值:
if (int.TryParse(Qnt.Text, out quant))
{
Qnt.Text = (quant + 1).ToString();
}
Run Code Online (Sandbox Code Playgroud)
尽可能避免在其他表达式的中间使用复合赋值.它通常会导致疼痛.
此外,感觉所有这些解析和格式化都隐藏了真实模型,即应该有某个int属性,这可能会反映在UI中.例如:
private void ButtonUp_Click(object sender, RoutedEventArgs e)
{
// This is an int property
Quantity++;
// Now reflect the change in the UI. Ideally, do this through binding
// instead.
Qnt.Text = Quantity.ToString();
}
Run Code Online (Sandbox Code Playgroud)
您正在使用post -increment运算符.这将重新评估原始值,然后递增.要在单行中执行您想要的操作,您可以使用pre -increment运算符.
(++quant).ToString();
Run Code Online (Sandbox Code Playgroud)
但更好的方法是避免所有这些陷阱并像这样做:
quant++;
string s = quant.ToString();
Run Code Online (Sandbox Code Playgroud)
在第一个版本中,您必须考虑事情发生的顺序.在第二个版本中,不需要考虑.始终比简洁更重视代码清晰度.
很容易相信单行版本在某种程度上更快,但事实并非如此.在20世纪70年代的C系统中,这可能是真的,但即便如此,我也怀疑.