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

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

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

How Can I Simplify INotifyPropertyChanged Implementation in C#?

自動化INotifyPropertyChanged實現

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

簡化實現

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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"); }

    }

}

登入後複製

這將屬性實現簡化為:

1

2

3

4

5

private string name;

public string Name {

    get { return name; }

    set { SetField(ref name, value); }

}

登入後複製

利用C#改進進行增強

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

1

2

3

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

    // ...

}

登入後複製

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

1

set { SetField(ref name, value); }

登入後複製

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

C# 6.0:

1

2

3

protected void OnPropertyChanged([CallerMemberName] string propertyName = null) {

    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

登入後複製

C# 7.0:

1

2

3

4

5

6

7

8

9

10

11

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和可為空引用類型:

1

2

3

4

5

6

7

8

9

10

11

12

13

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板