You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:03