条件运算符与自增:如何精简实现条件自增置零逻辑
「满足条件自增、否则重置数值」的精简写法
你之前试的NoReadsInSequence = noRead ? ++: 0;跑不通,原因很简单:++是单目运算符,必须跟操作数搭配用,不能单独放在三元表达式的分支里当返回值,不符合C#这类类C语言的语法规则。
几种可落地的写法
- 最通用的单行三元写法
这是行业里用得最多的单行实现,不用单独写自增语句,符合条件就返回当前值+1,不符合就返回0:
虽然变量名在等号左右各出现一次,但逻辑直白,谁看了都能马上懂,比硬凑「完全不重复写变量名」的花活实用得多。NoReadsInSequence = noRead ? NoReadsInSequence + 1 : 0; - 利用隐式转换的超短写法(不推荐生产环境用)
类C语言里基本都有布尔值转整数的规则:true转成1,false转成0,靠这个规则可以把代码压得更短:
逻辑是不管条件成不成立先自增,条件不成立就乘0直接重置,条件成立乘1保留自增结果。但可读性极差,不熟悉隐式转换的人看了得反应半天,除非是玩代码高尔夫,不然别写这种坑队友的代码。NoReadsInSequence = ++NoReadsInSequence * noRead; - 严格不重复写变量名的写法
如果非要满足「不重复写NoReadsInSequence」的要求,C# 7.0以上可以靠ref局部变量实现,先给原变量起个别名,后续操作别名就行:
纯粹是为了满足规则硬凑的写法,实际开发里一点收益都没有,平白多了一行声明,完全没必要。ref var seq = ref NoReadsInSequence; seq = noRead ? seq + 1 : 0;
额外提一句:你最开始写的if/else版本其实是可读性最高的,一点都不冗余。写代码别盲目追求短,可维护性永远比代码行数少重要。
内容的提问来源于stack exchange,提问作者Martin Hertig
相关产品推荐
相关产品推荐

