[英]C# Structs, events and constructor
當希望擁有一個值的集合並在該集合發生更改時收到通知時,可以使用ObservableCollection
及其CollectionChanged
事件。
但是,僅在修改集合本身時才會觸發其CollectionChanged
事件,而不會修改其包含的值。 例如,如果我有一個ObservableCollection<Image>
,那么我將無法檢測到有人何時訪問該集合的第N個圖像並調用修改它的方法。 如果我有一個ObservableCollection<Color>
他也是一樣。 如果我希望能夠監視何時分配了列表中包含的Color結構,則項目本身必須是可觀察的(遞歸)。 一個Color
結構不可觀察,我想將其封裝到一個名為ObservableColor
的結構中。
問題在於,編譯器對我大吼大叫,因為該事件未在構造函數中初始化。 好吧,首先我不知道必須初始化一個事件,其次我不知道應該如何初始化它。
下面是我的代碼:
struct ObservableColor : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color Value { get; private set; }
public ObservableColor(Color color)
{
Value = color;
}
public void Set(Color color)
{
Color oldColor = Value;
Value = color;
if (Value != oldColor)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
}
我該如何進行編譯? 謝謝。
C#要求在值類型的構造函數中顯式初始化所有字段。 您收到此錯誤的原因僅僅是因為PropertyChanged
在構造函數完成之前未分配任何東西。 解決這個問題很簡單,只需執行以下操作:
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null;
}
也就是說,您應該考慮更改方法。 可變結構是各種令人頭痛,意外行為和細微錯誤的來源,這些錯誤會使您發瘋。 我建議將ObservableColor
更改為引用類型。
正如評論中已經提到的, 可變結構是邪惡的 。 因此,進行此編譯的最佳方法是使此類型成為class
:
class ObservableColor : INotifyPropertyChanged
{...}
如果您確實需要將其用作struct
,則構造函數必須初始化該struct
所有字段,甚至event
:
struct ObservableColor : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color Value { get; private set; }
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null; // initiailze
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.