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

如何自动为BlogPost类的TotalVotes属性赋值为Upvotes-Downvotes?

如何让C#类的TotalVotes自动计算Upvotes与Downvotes的差值?

没问题,要实现让TotalVotes自动等于Upvotes - Downvotes,有几种实用的方法,我给你详细讲讲,你可以根据自己的场景选择:

方案1:使用只读计算属性(最推荐)

这是最简洁也最符合C#设计思想的方式,直接把TotalVotes改成只读的计算属性,每次访问它的时候都会实时计算差值,完全不用担心数据不同步的问题:

public class BlogPost
{
    public int BlogPostId { get; set; }
    public string BlogPostTitle { get; set; }
    public string BlogPostDescription { get; set; }
    public int Upvotes { get; set; }
    public int Downvotes { get; set; }
    
    // 用表达式体定义只读计算属性,实时返回差值
    public int TotalVotes => Upvotes - Downvotes;
}

这种方式的优势在于:不需要额外维护字段或逻辑,代码简洁易懂,而且TotalVotes永远和Upvotes、Downvotes保持一致,适合绝大多数普通场景。

方案2:在Upvotes和Downvotes的Setter中更新TotalVotes

如果你的场景要求TotalVotes必须有可写的Setter(比如和某些ORM框架兼容,或者需要序列化),可以通过私有字段+自定义Setter的方式,在修改Upvotes或Downvotes时自动更新TotalVotes:

public class BlogPost
{
    private int _upvotes;
    private int _downvotes;

    public int BlogPostId { get; set; }
    public string BlogPostTitle { get; set; }
    public string BlogPostDescription { get; set; }

    public int Upvotes
    {
        get => _upvotes;
        set
        {
            _upvotes = value;
            UpdateTotalVotes();
        }
    }

    public int Downvotes
    {
        get => _downvotes;
        set
        {
            _downvotes = value;
            UpdateTotalVotes();
        }
    }

    // 把Setter设为private,避免外部直接修改导致数据不一致
    public int TotalVotes { get; private set; }

    private void UpdateTotalVotes()
    {
        TotalVotes = Upvotes - Downvotes;
    }
}

这里我们把TotalVotes的Setter限制为私有,确保只有内部逻辑能修改它,避免外部代码随意赋值破坏数据一致性。

方案3:带属性变更通知的实现(适合UI绑定场景)

如果你的类需要在WPF、Blazor或者其他MVVM架构中使用,需要实现INotifyPropertyChanged来触发UI刷新,那可以在属性变更时同步更新TotalVotes并发送通知:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class BlogPost : INotifyPropertyChanged
{
    private int _upvotes;
    private int _downvotes;
    private int _totalVotes;

    public int BlogPostId { get; set; }
    public string BlogPostTitle { get; set; }
    public string BlogPostDescription { get; set; }

    public int Upvotes
    {
        get => _upvotes;
        set
        {
            if (_upvotes != value)
            {
                _upvotes = value;
                OnPropertyChanged();
                UpdateTotalVotes();
            }
        }
    }

    public int Downvotes
    {
        get => _downvotes;
        set
        {
            if (_downvotes != value)
            {
                _downvotes = value;
                OnPropertyChanged();
                UpdateTotalVotes();
            }
        }
    }

    public int TotalVotes
    {
        get => _totalVotes;
        private set
        {
            if (_totalVotes != value)
            {
                _totalVotes = value;
                OnPropertyChanged();
            }
        }
    }

    private void UpdateTotalVotes()
    {
        TotalVotes = Upvotes - Downvotes;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

这个方案在修改Upvotes或Downvotes时,不仅会更新TotalVotes,还会触发PropertyChanged事件,让绑定的UI组件自动刷新TotalVotes的显示,完美适配需要数据绑定的场景。

内容的提问来源于stack exchange,提问作者Rakshith Murukannappa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:00:52