C#属性值不等于目标值时才赋值的简写方法,避免setter重复触发
解决方案
C# 没有原生的“不等则赋值”运算符,不过有以下几种符合你需求的简洁实现方式:
方案1:简化if判断(无额外改造,最直接)
直接把嵌套的if判断压缩为单行写法,没有任何额外开销,完全符合你“先判断再赋值”的要求:
if (SubMode != EntryMode.View) SubMode = EntryMode.View;
替换到你的MainMode setter里后,代码会更紧凑:
set { _mainMode = value; if (value == EntryMode.View) { if (SubMode != EntryMode.View) SubMode = EntryMode.View; // 执行其他逻辑 } }
方案2:修改SubMode setter(一劳永逸,推荐)
直接在SubMode的setter入口加值相等校验,只要新旧值一致就直接返回,后续所有给SubMode赋值的场景都不需要额外判断,也不会触发重复逻辑:
EntryMode SubMode { get => _subMode; set { // 新增这行,值相等直接跳过后续逻辑 if (_subMode == value) return; _subMode = value; if (value == EntryMode.View) { // 执行一次性逻辑 } } }
改造完成后,你可以直接在MainMode里赋值即可,不用再额外加判断:
if (value == EntryMode.View) { SubMode = EntryMode.View; // 执行其他逻辑 }
方案3:封装扩展方法(复用性高,适合多处使用的场景)
如果你在项目里大量需要这种“不等则赋值”的操作,可以封装通用扩展方法(C# 7.0及以上支持ref扩展):
public static class EntryModeExtensions { public static void SetIfNotEqual(this ref EntryMode current, EntryMode target) { if (current != target) current = target; } }
使用时只需要一行代码:
SubMode.SetIfNotEqual(EntryMode.View);
注意:不要使用
SubMode = SubMode == EntryMode.View ? SubMode : EntryMode.View这类三元运算写法,即使新旧值相等也会触发setter执行,不符合你的需求。
内容的提问来源于stack exchange,提问作者Taher
相关产品推荐
相关产品推荐

