bob*_*rob 3 .net c# ternary-operator
我有点困惑为什么这不起作用:
id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);
Run Code Online (Sandbox Code Playgroud)
这里的输入可以是转换为INT的int或char.然后我递增id并增加int或char.问题是,当我输入一个字符时,数字似乎没有改变?
Eri*_*ert 14
这是一个非常糟糕的编程实践,你正在使用.条件表达式应该不会有副作用; 他们应该计算价值.你正在执行副作用,然后扔掉副作用!您应该(1)制作无副作用的版本:
id = (isChar && id > 121) ? 65 : id + 1;
Run Code Online (Sandbox Code Playgroud)
或(2)将您的副作用版本写为陈述,而不是表达:
if (isChar && id > 121)
id = 65;
else
id++;
Run Code Online (Sandbox Code Playgroud)
让我们更详细地了解这个原始错误代码的简化版本有什么问题:
id = whatever ? 65 : id++;
Run Code Online (Sandbox Code Playgroud)
假设whatever是假的.怎么了? id++在道德上等同于:
int PostIncrement(ref int x)
{
int temp = x;
x = temp + 1;
return temp;
}
Run Code Online (Sandbox Code Playgroud)
所以假设你做了:
id = whatever ? 65 : PostIncrement(ref id);
Run Code Online (Sandbox Code Playgroud)
怎么了?假设id是1.你通过参考传递它PostIncrement.PostIncrement复制id- 1 - 的值temp.然后它添加一个 - 2 - 并将结果分配给id.所以,id现在是2.然后返回1.
回到调用者,id现在是2,然后你分配结果PostIncrement,即1,现在又id是1.
不要id++用来表示,id + 1因为这根本不是什么意思.
更改id++到id + 1在这两种情况下.你正在丢弃最后执行的赋值增量的变化.
作为一般规则,避免++复杂表达式中的副作用(例如).他们使整个表达难以处理.这让你绊倒了.
更好的是,id事先增加,因为你似乎总是增加它:
id += 1;
if (isChar && id > 122)
id = 65;
Run Code Online (Sandbox Code Playgroud)
要么
id = (isChar && id > 121) ? 65 : id + 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3761 次 |
| 最近记录: |