首頁 > 後端開發 > C++ > 如何簡化C#中的InotifyPropertychanged實現?

如何簡化C#中的InotifyPropertychanged實現?

Mary-Kate Olsen
發布: 2025-02-02 09:26:09
原創
1007 人瀏覽過

How Can I Simplify INotifyPropertyChanged Implementation in C#?

自動化INotifyPropertyChanged實現

在.NET對像中,INotifyPropertyChanged接口對於通知其他組件屬性變化至關重要。手動實現它需要為每個屬性引發PropertyChanged事件,這可能會很繁瑣。本文探討簡化此過程的方法。

簡化實現

一種常見的方法是創建一個輔助方法,例如SetField(),來處理引發事件的樣板代碼:

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"); }
    }
}
登入後複製

這將屬性實現簡化為:

private string name;
public string Name {
    get { return name; }
    set { SetField(ref name, value); }
}
登入後複製

利用C#改進進行增強

C# 5引入了CallerMemberName屬性,允許自動推斷屬性名稱:

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

有了這個增強功能,您可以進一步簡化屬性實現:

set { SetField(ref name, value); }
登入後複製

更高版本的C#提供了更多增強功能來簡化實現:

C# 6.0:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null) {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
登入後複製

C# 7.0:

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);
}
登入後複製

C# 8.0和可為空引用類型:

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);
}
登入後複製

這些增強功能顯著簡化了INotifyPropertyChanged的實現,使其在現代版本的C#中不再是一項繁瑣的任務。

以上是如何簡化C#中的InotifyPropertychanged實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板