如何自动为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
相关产品推荐
相关产品推荐

