为了账号安全,请及时绑定邮箱和手机立即绑定

说到get,C#有什么捷径吗?并设置;哪个调用onPropertyChanged?

说到get,C#有什么捷径吗?并设置;哪个调用onPropertyChanged?

C#
江户川乱折腾 2021-11-14 14:35:42
我有这段代码用于在我的应用程序中设置属性:string _backgroundColor;public string BackgroundColor{    get => _backgroundColor;    set => SetProperty(ref _backgroundColor, value);}和public class ObservableObject : INotifyPropertyChanged{    protected virtual bool SetProperty<T>(            ref T backingStore, T value,            [CallerMemberName]string propertyName = "",            Action onChanged = null)    {        if (EqualityComparer<T>.Default.Equals(backingStore, value))            return false;        backingStore = value;        onChanged?.Invoke();        OnPropertyChanged(propertyName);        return true;     }     public event PropertyChangedEventHandler PropertyChanged;     protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = "") =>            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}我记得读过一些关于我可以在 C# 中使用 { get; 的地方。放; }. 有什么办法可以在这种情况下使用它,这样我就不必自己继续声明局部变量了吗?
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

您的代码已经显示了实现 INotifyPropertyChanged 的类中属性的典型快捷方式。使用普通的 C# 没有更短的方法。如果你只使用 {get;set;} 你就失去了在 getter 和 setter 中调用任何东西的可能性。

如果您只是想自动添加 PropertyChanged 调用(并失去对它的一些控制),您可以查看面向方面的编程,例如使用PostSharp(商业)或Fody(开源)。这些工具在编译时/之后修改您的代码,并允许规则修改您的代码。


查看完整回答
反对 回复 2021-11-14
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我看到了使用 PostSharp 的 [NotifyPropertyChanged] 的建议,我的责任是提及一个更好的免费替代方案:Stepen Cleary 的计算属性。 https://github.com/StephenCleary/CalculatedProperties/blob/master/README.md


说明:Postsharp 确实允许您编写简短的格式,即


string { get; set; }  

和火灾通知。这是计算属性的唯一优势,它们更冗长,但您仍然不需要支持字段:


{

    get { return Property.Get(string.Empty); }

    set { Property.Set(value); }

}

您很快就会发现,尽管输入的数量是一个小问题,但主要的挑战是依赖于其他属性的属性,这就是 CalculatedProperties 在所有方面击败 PostSharp 的地方。


来自 PostSharp 文档:


“如果属性 getter 从其类或委托中调用虚拟方法,或引用另一个对象的属性(不使用规范形式 this.field.Property),PostSharp 将生成错误,因为它无法在构建时解析此类依赖项. 当您的属性 getter 包含复杂的数据流,例如循环,或调用其他类的方法(属性 getter 除外)时,同样的限制适用。发生这种情况时,您可以重构代码,以便 PostSharp 自动分析,或者你可以接管分析代码的责任”


这些限制均不适用于计算属性。它可以执行循环、虚拟方法、LINQ 到对象,基本上任何您可以想象的疯狂运行时依赖关系都无关紧要,依赖关系图在运行时重新连接自身,并且无需任何仪式即可工作。它们也更快且免费。


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信