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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-02 09:26:091009瀏覽

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