首页 >后端开发 >C++ >如何简化C#中的InotifyPropertychanged实现?

如何简化C#中的InotifyPropertychanged实现?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-02 09:26:09926浏览

How Can I Simplify INotifyPropertyChanged Implementation in C#?

自动化INotifyPropertyChanged实现

在.NET对象中,INotifyPropertyChanged接口对于通知其他组件属性变化至关重要。手动实现它需要为每个属性引发PropertyChanged事件,这可能会很繁琐。本文探讨简化此过程的方法。

简化实现

一种常见的方法是创建一个辅助方法,例如SetField(),来处理引发事件的样板代码:

<code class="language-csharp">public class Data : INotifyPropertyChanged {
    // ...
    protected bool SetField<T>(ref T field, T value, string propertyName) {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    // 使用SetField()的属性实现
    private string name;
    public string Name {
        get { return name; }
        set { SetField(ref name, value, "Name"); }
    }
}</code>

这将属性实现简化为:

<code class="language-csharp">private string name;
public string Name {
    get { return name; }
    set { SetField(ref name, value); }
}</code>

利用C#改进进行增强

C# 5引入了CallerMemberName属性,允许自动推断属性名称:

<code class="language-csharp">protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
    // ...
}</code>

有了这个增强功能,您可以进一步简化属性实现:

<code class="language-csharp">set { SetField(ref name, value); }</code>

更高版本的C#提供了更多增强功能来简化实现:

C# 6.0:

<code class="language-csharp">protected void OnPropertyChanged([CallerMemberName] string propertyName = null) {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}</code>

C# 7.0:

<code class="language-csharp">protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) {
    // ...
}

private string name;
public string Name {
    get => name;
    set => SetField(ref name, value);
}</code>

C# 8.0和可为空引用类型:

<code class="language-csharp">public event PropertyChangedEventHandler? PropertyChanged;

protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "") {
    // ...
}

private string name;
public string Name {
    get => name;
    set => SetField(ref name, value);
}</code>

这些增强功能显着简化了INotifyPropertyChanged的实现,使其在现代版本的C#中不再是一项繁琐的任务。

以上是如何简化C#中的InotifyPropertychanged实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn